Android - 如何处理单个 ListViewItem 中的多个元素?

Posted

技术标签:

【中文标题】Android - 如何处理单个 ListViewItem 中的多个元素?【英文标题】:Android - How to handle multiple Elements in a singe ListViewItem? 【发布时间】:2018-03-04 21:10:03 【问题描述】:

我有一个特定的问题。我正在创建一个应用程序,它允许我显示某些菜肴的收据。我设计了一个包含 TextView 和 RatingBar 的自定义适配器。因此,在我的其他活动(ViewDatabase)中,我从 JSON 文件中检索菜名(方法称为:showData)并将其显示在获取自定义适配器的 ListView 上。

我现在的问题是不知道为什么我只能选择我的菜名(所以我的适配器的文本视图)或评级栏(也在我的适配器中)。

我尝试输入方法:myListView.setItemsCanFocus(true);但还是不行。

我没有在适配器中为我的文本实现 clicklistener 吗?我试图实现一个。我需要一个交换活动的明确意图,但我不能 在一个意图中从一个适配器类转到另一个类。

在 ViewDatabse- 类中是 onItemClick 如果我单击文本,我更改活动的方法。

这是我的代码:

适配器:

一)

public UserInformationAdapter(Context context, List<UserInformation> objects) 
    super(context, R.layout.rating_item, objects);
    this.context = context;
    table = objects;


@Override
public View getView(int position, View convertView, ViewGroup parent) 
    View v = convertView;

    if (v == null) 
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = inflater.inflate(R.layout.rating_item, null);
    

    TextView name = (TextView) v.findViewById(R.id.hauptgerichte);
    RatingBar ratingBar = (RatingBar) v.findViewById(R.id.rate_bar);

    UserInformation userInformation = table.get(position);


    ratingBar.setOnRatingBarChangeListener(onRatingChangedListener(position));

    ratingBar.setTag(position);
    ratingBar.setRating(getItem(position).getRatingStar());

    name.setText(userInformation.getName());

    name.setTag(position);
    return v;


private RatingBar.OnRatingBarChangeListener onRatingChangedListener(final int position) 
    return new RatingBar.OnRatingBarChangeListener() 
        @Override
        public void onRatingChanged(RatingBar ratingBar, float v, boolean b) 
            UserInformation item = getItem(position);
            assert item != null;
            item.setRatingStar(v);
            Log.i("Adapter", "star: " + v);
        
    ;

这是项目(用于名称和评分栏):

公共类用户信息

private String name;
private float ratingStar;


public UserInformation()



public String getName() 
    return name;



public void setName(String name) 
    this.name = name;


void setRatingStar(float ratingStar) 
    this.ratingStar = ratingStar;


float getRatingStar() 
    return 0;



    @Override
public String toString()
    return name;

这是检索名称的活动:

活动:

公共类 ViewDatabase 扩展 AppCompatActivity

private static final String TAG = "ViewDatabase";
private FirebaseDatabase mFirebaseDatabase;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private DatabaseReference myRef;
private String userID;
private  ArrayList<String> array;

private final List<UserInformation>  arr = new ArrayList<>();
private UserInformationAdapter adapter2;

private ListView mListView;




@Override
protected void onCreate(@Nullable Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.view_database_layout);

    array = new ArrayList<>();
    mListView = (ListView) findViewById(R.id.list_karnivoure);
    mListView.setItemsCanFocus(true);


    mAuth = FirebaseAuth.getInstance();
    mFirebaseDatabase = FirebaseDatabase.getInstance();
    myRef = mFirebaseDatabase.getReference();


    FirebaseUser user = mAuth.getCurrentUser();
    userID = user.getUid();





    myRef.child("shakes").addValueEventListener(new ValueEventListener() 
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) 
            // This method is called once with the initial value and again
            // whenever data at this location is updated.
            showData(dataSnapshot);
        

        @Override
        public void onCancelled(DatabaseError databaseError) 

        
    );


private void showData(DataSnapshot dataSnapshot) 

    Iterable<DataSnapshot> children = dataSnapshot.getChildren();

    for (DataSnapshot child: children)

        UserInformation uInfo =  child.getValue(UserInformation.class);
        arr.add(uInfo);

        adapter2 = new UserInformationAdapter(ViewDatabase.this, arr);

        mListView.setAdapter(adapter2);
        mListView.setItemsCanFocus(true);

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

                mListView.setItemsCanFocus(true);
                Object listItem = mListView.getItemAtPosition(position);
                Intent i = new Intent(ViewDatabase.this,KarnivoureInput.class);
                i.putExtra("name", listItem.toString());
                startActivity(i);
            
        );

    

【问题讨论】:

【参考方案1】:

https://***.com/a/8955441/5608931

尝试将此属性添加到 TextViewRatingBar 。它将是可点击的,但不会获得焦点

android:focusable="false"

【讨论】:

这对我不起作用。我想主要的问题是我的适配器中没有 textView 的点击监听器。我不知道如何在那里为 textView 添加一个。我在 ViewDatabase 类中实现了一个单击侦听器,该类“onItemClick”为我提供了整个项目的 clicklsitener。这个“onItemClick”返回列表视图中一道菜的​​名称并将其提供给另一个活动。我怎么能在 customAdapter 中实现这个意图?

以上是关于Android - 如何处理单个 ListViewItem 中的多个元素?的主要内容,如果未能解决你的问题,请参考以下文章

Android - 如何处理单个 ListViewItem 中的多个元素?

如何处理单个活动的多个片段

c# foreach块程序如何处理ListView?

如何在android 动态加载插件small

当 ListView 有 ItemTemplate 时如何处理 ListViewItem 的右键单击?

如何处理 ListView 中的多个倒数计时器?