Android-传递ListView中单击项的值并将其显示在新的Actvity

时间:2018-08-27 04:21:39

标签: java android listview

我是这家公司的实习生,我有一个由团队负责人分配给我的任务,我需要制作一个应用程序来显示可以添加到其中的项目列表,并可以编辑/删除列表中的项目。我正在遵循应用程序需要执行的操作。

我遇到的问题是,单击使用自定义适配器的ListView时,我需要传递项目中的值,并将其发送到新活动并显示在新活动的{{ 1}}和textviews。我尝试在列表单击方法中使用imageview方法,并使用putExtras()方法获取值,但是它们不起作用,并且我已经删除了这些代码,因此它们不再存在。如果您需要更多我正在使用的课程/活动,请告诉我。我正在使用 Android Studio 3.1.4

ItemListView.java

getExtras()

ViewItemClicked.java 我希望单击行时将值显示在此活动的布局上。

public class ItemListView extends AppCompatActivity {

DatabaseHelper myDB;

ArrayList<Item> itemList;
ListView listView;

Item item;

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

    listView = (ListView) findViewById(R.id.listView);
    myDB = new DatabaseHelper(this);
    itemList = new ArrayList<>();
    Cursor data = myDB.getListContents();

    int numRows = data.getCount();
    if(numRows == 0){
        Toast.makeText(ItemListView.this, "There is nothing in the database.", Toast.LENGTH_LONG).show();
    } else {
        while(data.moveToNext()){
            item = new Item(data.getString(1), data.getString(2), data.getString(3));
            itemList.add(item);
        }
        Row_ListAdapter adapter = new Row_ListAdapter(this, R.layout.list_adapter_view, itemList);
        listView = (ListView) findViewById(R.id.listView);
        listView.setAdapter(adapter);
    }

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            Intent intent = new Intent(ItemListView.this, ViewItemClicked.class);

            startActivity(intent);
        }
    });
}

我使用过的其他类:

Row_ListAdapter.java

public class ViewItemClicked extends AppCompatActivity {

    ImageView image;
    TextView name, desc;

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

}

链接到GUI:https://i.stack.imgur.com/wHfgv.png

4 个答案:

答案 0 :(得分:0)

尝试以下代码:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            Intent intent = new Intent(ItemListView.this, ViewItemClicked.class);
            String name = itemList.get(position).getString(1);
            String description = itemList.get(position).getString(2);
            String something_else = itemList.get(position).getString(3);
            intent.putExtra("name", name);
            intent.putExtra("description", description);
            intent.putExtra("something_else", something_else);
            startActivity(intent);
        }

在“详细信息”活动中:

Intent intent = getIntent();
    String name = intent.getStringExtra("name");
    String description = intent.getStringExtra("description");
    String something_else = intent.getStringExtra("something_else");

现在使用字符串在所需位置显示值。

edittext.setText(name);

答案 1 :(得分:0)

在传递数据之前,像这样通过Serializable实现Item类:

public class Item implements Serializable{
     /*your class code here*/
}

然后像这样在listView.setOnItemClicklistener中传递数据

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Item passItem = itemList.get(position);
            Intent intent = new Intent(ItemListView.this, ViewItemClicked.class);
            Bundle itemBundle = new Bundle();
            itemBundle.putSerializable("dataItem",passItem)// put the data and define the key
            intent.putExtras(itemBundle)
            startActivity(intent);
        }
    });

并在ViewItemClicked.Class中打开数据

public class ViewItemClicked extends AppCompatActivity {

    ImageView image;
    TextView name, desc;
    Item item;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        item = (Item) getIntent().getSerializableExtra("dataItem"); // use the key
        setContentView(R.layout.activity_view_item_clicked);
        /*now u can use the item data*/
    }
}

答案 2 :(得分:0)

您正在使用哪种格式的图像

是Base64还是Bitmap,如果是Base64,请尝试以下代码。

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            Intent intent = new Intent(ItemListView.this, ViewItemClicked.class);
            String name = list.get(position).getName();
            String description = list.get(position).getDescription();
            String image= list.get(position).getImage();
            startActivity(intent);
        }

在您的第二次活动中,使用此代码。

Intent intent = getIntent();
    String name = intent.getStringExtra("name");
    String description = intent.getStringExtra("description");
    String image = intent.getStringExtra("image");

在此处将Base64转换为位图。

 byte[] decodedString = Base64.decode(image, Base64.DEFAULT);
 Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, 
 decodedString.length);

答案 3 :(得分:0)

定义用于监听项目点击事件的界面

public class Row_ListAdapter extends ArrayAdapter<Item> {

private LayoutInflater mInflater;
private ArrayList<Item> items;
private int mViewResourceId;
ImageView image;
TextView name;
TextView description;

OnItemListener mListener;

public Row_ListAdapter(Context context, int textViewResourceId, ArrayList<Item> items){
    super(context, textViewResourceId, items);
    this.items = items;

    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mViewResourceId = textViewResourceId;
}

public View getView(int position, View convertView, ViewGroup parents){

    convertView = mInflater.inflate(mViewResourceId, null);

    Item item = items.get(position);

    if(item != null){

        image = (ImageView) convertView.findViewById(R.id.iconIV);
        name = (TextView) convertView.findViewById(R.id.nameTV);
        description = (TextView) convertView.findViewById(R.id.descTV);

        if(image != null){
            image.setImageBitmap(item.getImage());
        }
        if(name != null){
            name.setText(item.getName());
        }
        if(description != null){
            description.setText(item.getDescription());
        }
    }

    convertView.setOnClickListener((v) -> {
        if(mListener != null) {
            mListener.onItemClick(v, item);
        }
    })
    return convertView;
}

public void setOnItemListener(OnItemListener listener) {
   mListener = listener;
}

public interface OnItemClickListener {
   void onItemClick(View v, Item item);
}

}

然后,在活动中实现OnItemClickListener并将其设置为适配器:

Row_ListAdapter adapter = new Row_ListAdapter(this, R.layout.list_adapter_view, itemList);
adapter.setOnItemListener("your implement");