【问题标题】:How to get values of a ListView items when clicking on the listview item's button单击列表视图项的按钮时如何获取列表视图项的值
【发布时间】:2021-12-15 10:18:57
【问题描述】:

我有一个名为 ListOfPetsActivity.java 的活动,它正在显示 Pet 对象的 ListView。 Pet.java 看起来像这样

    public class Pet {
    
        private int petId;
        private String petName;
        private int age;
        //getters, setters and constructors
    }

我正在使用自定义适配器在 ListView 中显示宠物对象,该适配器当前仅显示宠物的名称并有一个名为 requestAcceptButton 的按钮。

这是适配器

    public class RequesterAdapter extends ArrayAdapter<Pet> {
    
        private List<Pet> requestersList;
        private Context context;
    
        public RequesterAdapter(Context context, List<Pet> requestersList) {
            super(context, -1, requestersList);
            this.context = context;
            this.requestersList = requestersList;
        }
    
        @NonNull
        @Override
        public View getView(int position, @Nullable View currentItemView, @NonNull ViewGroup parent) {
            if (currentItemView == null) {
                currentItemView = LayoutInflater.from(getContext()).inflate(R.layout.requester_item, parent, false);
            }
    
            // get the position of the view from the ArrayAdapter
            Pet currentPetPosition = getItem(position);
    
            TextView requesterNameTextView = currentItemView.findViewById(R.id.requesterNameTextView);
            requesterNameTextView.setText(currentPetPosition.getPetName() + ", " +currentPetPosition.getAge());
    
            Button requestAcceptButton = currentItemView.findViewById(R.id.requestAcceptButton);
            
            return currentItemView;
        }
    
    }

现在,显示所有宠物的 ListView 的当前活动,ListOfPetsActivity.java 显示宠物列表及其名称和年龄,并且旁边有一个按钮。
当我单击它时,我想从该 ListView 项中获取 pet 对象的所有值并将其保存在 string 和 int 类型的变量中,以便我可以与数据库进行通信。问题是,我需要在这个活动中而不是在适配器中这样做。那么,我怎样才能从 ListView 项目中获取所有项目呢?

我在ListOfPetsActivity 中像这样设置 ListView 及其适配器。

    RequesterAdapter requesterAdapter = new RequesterAdapter(ListOfPetsActivity.this, friendRequesterPetsList);
    requesterListView.setAdapter(requesterAdapter);

【问题讨论】:

  • private List&lt;Pet&gt; requestersList; 公开。使用requestAdapter.requestList 获取宠物列表。或者更简单:只需使用friendRequesterPetsList

标签: android android-listview


【解决方案1】:

第一步: 创建一个接口

interface PetClickListener {
      fun onPetSelected(petAge: Int)
}

Step2:在你的Activity中实现接口:

ListOfPetsActivity implement PetClickListener {
{
  override onPetSelected(petAge: Int) {
       // here you will get pet Age of selected Pet in the list
  }
}

第三步:更新你的适配器构造函数:

RequesterAdapter requesterAdapter = new RequesterAdapter(ListOfPetsActivity.this, friendRequesterPetsList, this);

Step4:在适配器中创建一个全局变量:

private PetClickListener petClickListener;

Step5:在构造函数中初始化:

public RequesterAdapter(Context context, List<Pet> requestersList, PetClickListener listener) {
        super(context, -1, requestersList);
        this.context = context;
        this.requestersList = requestersList;
        petClickListener = listener;
    }

第六步:点击按钮时使用这个petClickListener

requestAcceptButton.setOnClickListener {
    petClickListener(currentPetPosition.getAge())
}

这样,您将在宠物年龄的活动中收到回调。 注意:我在这里使用了 Kotlin 和 java。但这会给你一个解决问题的想法。

如果您需要进一步的帮助,请告诉我。

【讨论】:

  • 你好,这对我不起作用
【解决方案2】:

您可以使用interface 在活动中获取您的Pet 对象。

RequesterAdapter 类中创建一个接口

  public interface ItemClickListener {
        void onItemClick(Pet pet);
  }

RequestAdapter 构造函数更改为接受ItemClickListener 并将其分配给itemClickListener 对象。

private ItemClickListener itemClickListener;
public RequesterAdapter(Context context, List<Pet> requestersList, ItemClickListener itemClickListener) {
            super(context, -1, requestersList);
            this.context = context;
            this.requestersList = requestersList;
            this.itemClickListener = itemClickListener;
        }

MainActivity中实现这个接口并覆盖onItemClick

public class MainActivity extends AppCompatActivity implements RequesterAdapter.ItemClickListener {
    @Override
    public void onItemClick(Pet pet) {
        // execute your database operations
    }
}

触发onItemClick方法,来自requestAcceptButtonclickListener

requestAcceptButton.setOnClickListener(view -> itemClickListener.onItemClick(currentPetPosition));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多