【问题标题】:How to set up my listview.setOnItemClickListener() for a simple ListView (using only one class)如何为简单的 ListView 设置我的 listview.setOnItemClickListener()(仅使用一个类)
【发布时间】:2019-12-09 16:45:06
【问题描述】:

我正在为杂货清单创建一个简单的 ListView。用户输入项目并创建列表。我无法让其他活动识别所选项目。我设置了共享项目,但它不发送列表。它确实会发送带有主题行的电子邮件。我相信这是因为我对列表项的 onclick 监听器。

这是模拟器的图像。这显示了我打算分享的内容:

这里是 MainActivity:

public class MainActivity extends AppCompatActivity {

    //Global Variables for Grocery List
    ListView groceryList;
    ArrayList<String> aList =new ArrayList<String>();
    Button buttonAdd;
    EditText enterItem;
    ArrayAdapter<String> arrayAdapter;
    TextView item;
    String items = enterItem.getText().toString();

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

        //to include the action bar
        Toolbar toolbar = (Toolbar) findViewById(R.id.action_bar);
        setSupportActionBar(toolbar);

        //Grocery List, ListView
        groceryList= (ListView) findViewById(R.id.grocery_list);
        //set mode
        groceryList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);//this adds checkbox mode
        groceryList.setAdapter(arrayAdapter);


        //Set up User Input Button and Edit Text:
        buttonAdd=(Button)findViewById(R.id.button_add);
        enterItem = (EditText)findViewById(R.id.enter_item);
        item = (TextView)findViewById(R.id.textView);


        arrayAdapter = new ArrayAdapter<String>(getApplicationContext(),
                android.R.layout.simple_list_item_multiple_choice, aList); //this adds the checkboxes

        //Add Item Button onClickListener
        buttonAdd.setOnClickListener(new View.OnClickListener(){
           @Override
           public void onClick(View v){
               aList.add(items);
               arrayAdapter.notifyDataSetChanged();
           }
        });

        // ListView on item selected listener.
        groceryList.setOnItemClickListener(new AdapterView.OnItemClickListener(){
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                // what do I put here?
            }
        });
    }

    //Create options menu, it will show the three dots, in the home screen-action bar:
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_home, menu); //fill it with the menu
        return super.onCreateOptionsMenu(menu);
    }

    //To determine what menu_main item is selected code:
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {

        switch (item.getItemId()) {
            //write cases to check which menu_main item is selected and to implement actions
            case R.id.share:
                //Share your grocery list with a helpful friend
                Intent shareIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
                shareIntent.setType("text/*");
                shareIntent.putExtra(Intent.EXTRA_SUBJECT, "Grocery List");
                shareIntent.putExtra(Intent.EXTRA_TEXT, onContextItemSelected(item));
                startActivity(Intent.createChooser(shareIntent, "Share via"));

                Toast.makeText(this, "Shared It!", Toast.LENGTH_SHORT).show();
                return true;

            case R.id.viewList:
                //Click to view a list of all of your saved grocery items
                Toast.makeText(this, "View All Items", Toast.LENGTH_SHORT).show();
                return true;

            case R.id.save:
                //Save selected items to add to the "View All Items" list.
                Toast.makeText(this, "Items Are Saved", Toast.LENGTH_SHORT).show();
                return true;

            case R.id.delete:
                //Delete selected items from the Grocery List
                Toast.makeText(this, "Grocery List Items Deleted", Toast.LENGTH_SHORT).show();
                return true;

            default:
                //unknown error

            return super.onOptionsItemSelected(item);
        }


    }
}

这是我的 activity_mail.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <include
        android:id="@+id/action_bar"
        layout="@layout/action_bar_home"></include>

    <EditText
        android:id="@+id/enter_item"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="@string/enter_item"
        android:inputType="text"
        android:layout_gravity="center"/>

    <Button
        android:id="@+id/button_add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/add_item"
        android:layout_gravity="center"/>

    <ListView
        android:id="@+id/grocery_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

最后,这里是 item_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/item_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="TextView" />

</LinearLayout>

如何让我的 OnClickListener 识别 SELECTED 项,以便我的应用为它们执行活动,例如共享、删除等?

【问题讨论】:

    标签: java android listview onclicklistener


    【解决方案1】:

    在您的代码中,您将在将 arrayAdapter 设置为适配器后更改它的值。

    MainActivity开头onCreate

    groceryList= (ListView) findViewById(R.id.grocery_list);
    //set mode
    groceryList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);//this adds checkbox mode
    groceryList.setAdapter(arrayAdapter);
    

    它以arrayAdapter的当前值影响groceryList的适配器。

    然后,几行之后:

    arrayAdapter = new ArrayAdapter<String>(getApplicationContext(),
                    android.R.layout.simple_list_item_multiple_choice, aList);
    

    只需在开始时创建您的适配器,并且永远不要重新影响它的值(通过使用=)。相反,使用它的参考(使用addclearremoveetc)。

    所以你的代码会是这样的

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        //to include the action bar
        Toolbar toolbar = (Toolbar) findViewById(R.id.action_bar);
        setSupportActionBar(toolbar);
    
        // Affect the arrayAdapter
        arrayAdapter = new ArrayAdapter<String>(getApplicationContext(),
                    android.R.layout.simple_list_item_multiple_choice, aList); 
    
        //Grocery List, ListView
        groceryList= (ListView) findViewById(R.id.grocery_list);
        //set mode
        groceryList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);//this adds checkbox mode
    
        // and then use it as the adapter but never '=' it again
        groceryList.setAdapter(arrayAdapter);
    
    
        //Set up User Input Button and Edit Text:
        buttonAdd=(Button)findViewById(R.id.button_add);
        enterItem = (EditText)findViewById(R.id.enter_item);
        item = (TextView)findViewById(R.id.textView);
    
    
        ...
    }
    

    如果您不这样做,ListView 的适配器将是 arrayAdapter 的“旧”值,并且您没有处理它,因为您已经用新值删除了它。

    然后,当您想向列表中添加或项目时,请使用 ArrayAdapter 中的方法类似

    【讨论】:

    • 我按照你说的整理了信息,但它没有回答听众的问题。它仍然不会将所选项目发送到电子邮件正文。我只用一个文本字符串测试了我的意图。意图工作正常,因为它将字符串发送到电子邮件正文。我需要一个可以识别所选项目的侦听器。
    • 好的,我明白了,如果您使用的是ArrayAdapter,则必须使用适配器提供的方法。所以,在监听器中,而不是做 aList.add(items); 调用 arrayAdapter.add(items) !现在让我,如果它有效,我会更新答案
    【解决方案2】:

    我需要构建一个 ListActivity 类和一个 ListAdapter 类才能使我的代码正常工作。我相信我错过了这些课程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 2013-08-02
      • 2012-05-16
      • 1970-01-01
      相关资源
      最近更新 更多