Android listview как мне узнать, какой элемент я щелкнул и показать в другом действии

Я делаю приложение для Android, и у меня есть список из базы данных, который анализирует json. И я хочу, чтобы элемент Onclick в представлении списка открывал другое действие, у меня нет проблем с открытием нового действия при нажатии любого элемента. Но проблема в том, как я могу не узнать, какой элемент я щелкнул, и показать детали элемента для нового действия.

public class items extends BaseActivity {

private ProgressDialog pDialog;
private ArrayList<RowItem> rowItems = new ArrayList<RowItem>();
private ListView mylistview;
private CustomListAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_items);

    pDialog = new ProgressDialog(this);
    pDialog.setMessage("Loading...");
    pDialog.show();

    Response.Listener<String> responseListener = new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            try {
                JSONObject jsonResponse = new JSONObject(response);
                boolean error = jsonResponse.getBoolean("error");
                System.out.println(jsonResponse.toString());
                if (error){
                    String errorMessage = jsonResponse.getString("message");
                    AlertDialog.Builder builder = new AlertDialog.Builder(items.this);
                    builder.setMessage(errorMessage)
                            .setNegativeButton("Retry", null)
                            .create()
                            .show();
                }else {
                    JSONArray itemSet = jsonResponse.getJSONArray("itemSet");
                    for (int i = 0; i < itemSet.length(); i++){
                        JSONObject item = itemSet.getJSONObject(i);
                        String title = item.getString("title");
                        String seller = item.getString("nickName");
                        String price = item.getString("price");
                        String itemID = item.getString("itemID");
                        String image_view = item.getString("picPath");
                        String Path;
                        JSONArray pic = item.getJSONArray("picPath");
                        if (pic.length()==0)
                        {
                            Path="uploads/default.jpg";
                        }else {
                            Path = pic.getString(0);
                        }
                        RowItem row=new RowItem(title,seller,price,image_view,Path,itemID);
                        rowItems.add(row);

                    }
                    mylistview = (ListView) findViewById(R.id.list);
                    CustomListAdapter adapter = new CustomListAdapter(items.this, rowItems);
                    System.out.println(rowItems.isEmpty());
                    mylistview.setAdapter(adapter);

                    mylistview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                            Intent intent = new Intent(items.this, ItemDetail.class);
                            String title = ((TextView) view.findViewById(R.id.tv_title)).getText().toString();
                            String seller = ((TextView) view.findViewById(R.id.tv_seller)).getText().toString();
                            String price = ((TextView) view.findViewById(R.id.tv_price)).getText().toString();

                            intent.putExtra("title", title);
                            intent.putExtra("nickName", seller);
                            intent.putExtra("price", price);
                            startActivity(intent);

                        }
                    });
                }
            }catch (JSONException e){
                e.printStackTrace();
            }
        }
    };
    Intent intent = getIntent();
    ArrayList<String> list =intent.getStringArrayListExtra("userInfo");
    System.out.println(list.toString());
    itemRequest itemRequest = new itemRequest(list.get(0),list.get(1),responseListener);
    RequestQueue queue = Volley.newRequestQueue(items.this);
    queue.add(itemRequest);

    pDialog.dismiss();
}
}

Я использую адаптер

public class CustomListAdapter extends BaseAdapter {
private Context context;
private List<RowItem> rowItems;
private LayoutInflater inflater = null;

public static final String IMAGE_BASEURL = "http://XXXXXXXXXXXXXXXXXXXXXXXX/";

private LruCache<Integer, Bitmap> imageCache;
private RequestQueue queue;

public CustomListAdapter(Context context, List<RowItem> rowItems){
    this.context=context;
    this.rowItems=rowItems;
    inflater = LayoutInflater.from(context);

    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
    final int cacheSize = maxMemory / 8;
    imageCache = new LruCache<>(cacheSize);

    queue = Volley.newRequestQueue(context);
}
@Override
public int getCount() {
    return rowItems.size();
}

@Override
public Object getItem(int position) {
    return rowItems.get(position);
}

@Override
public long getItemId(int position) {
    return rowItems.indexOf(getItem(position));
}

private class ViewHolder{
    ImageView imageView;
    TextView tv_title;
    TextView tv_seller;
    TextView tv_price;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

    final RowItem row_pos = rowItems.get(position);
    final ViewHolder holder;
    System.out.print("=================================================================");
    if (convertView==null){
        convertView = mInflater.inflate(R.layout.custom_layout, null);
        holder = new ViewHolder();
        holder.tv_title = (TextView) convertView.findViewById(R.id.tv_title);
        holder.tv_seller = (TextView) convertView.findViewById(R.id.tv_seller);
        holder.tv_price = (TextView) convertView.findViewById(R.id.tv_price);

        convertView.setTag(holder);
    }else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.tv_title.setText(row_pos.getTv_title().toString());
    holder.tv_seller.setText(row_pos.getTv_seller().toString());
    holder.tv_price.setText(row_pos.getTv_price().toString());

    Bitmap bitmap = imageCache.get(Integer.parseInt(row_pos.getItemID()));
    holder.imageView = (ImageView) convertView.findViewById(R.id.image_view);

    if (bitmap != null){
        holder.imageView.setImageBitmap(bitmap);
        System.out.print("bitmap");
    }else {
        String imageURL = IMAGE_BASEURL + row_pos.getPath();
        ImageRequest request = new ImageRequest(imageURL, new Response.Listener<Bitmap>() {
            @Override
            public void onResponse(Bitmap response) {
                holder.imageView.setImageBitmap(response);
                imageCache.put(Integer.parseInt(row_pos.getItemID()), response);
                System.out.print(row_pos.getItemID()+"this is image");
            }
        }, 90, 90,
                Bitmap.Config.ARGB_8888,
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.d("error", error.toString());
                    }
                });
        queue.add(request);
    }
    return convertView;
}
}

И как передать данные, которые я беру из базы данных, в новое действие? Также я не могу отображать изображение из формы php. Я использовал волейбольную библиотеку. Это просмотр списка


person Dani Wang    schedule 06.04.2017    source источник
comment
Возможный дубликат Удалить выбранный элемент из listview android   -  person Martin Marconcini    schedule 06.04.2017
comment
Хотя это и не одно и то же, stackoverflow.com/a/32295106/2684 предоставляет то, что вы ищете. Выбранный элемент имеет позицию. Положение исходит от адаптера, возьмите элемент из адаптера. Это делалось, спрашивалось, отвечало и говорилось бесчисленное количество раз в любой поисковой системе и здесь, при переполнении стека.   -  person Martin Marconcini    schedule 06.04.2017


Ответы (1)


Если я вас правильно понял, вы хотите переносить данные между двумя действиями. Сделать это можно так:

//send data
mylistview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        //get the item and transform it to your JsonBean
        RowItem item= (RowItem) parent.getItemAtPosition(position);                         
        Intent intent = new Intent(items.this, ItemDetail.class);
        //put it in Intent,the item bean must implements Serializable
        intent .putExtra("RowItem",item)
        startActivity(intent);
    }

//receive data (in Activity of ItemDetail)
RowItem rowItem =(RowItem) getIntent().getSerializableExtra("RowItem");
// do something with rowItem,if your want know the position of item ,your alse can transport the positon(put the position in Intent object).
person KingJA    schedule 06.04.2017