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
尝试将此属性添加到 TextView
和 RatingBar
。它将是可点击的,但不会获得焦点
android:focusable="false"
【讨论】:
这对我不起作用。我想主要的问题是我的适配器中没有 textView 的点击监听器。我不知道如何在那里为 textView 添加一个。我在 ViewDatabase 类中实现了一个单击侦听器,该类“onItemClick”为我提供了整个项目的 clicklsitener。这个“onItemClick”返回列表视图中一道菜的名称并将其提供给另一个活动。我怎么能在 customAdapter 中实现这个意图?以上是关于Android - 如何处理单个 ListViewItem 中的多个元素?的主要内容,如果未能解决你的问题,请参考以下文章
Android - 如何处理单个 ListViewItem 中的多个元素?