单击按钮在列表项的文本视图中设置文本
set text in textview of a list item on click of button
我已经创建了一个列表视图,如下所示 image.Link:
问题: 我希望如果用户点击按钮 +
或 -
当前显示 0
的文本视图是相应地增加或减少。但是,如果我单击第一个项目的按钮,则文本视图会在其他行中更新。我不知道如何实现这个。
代码如下:
public class HomePage extends Fragment {
String[] listitems;
int[] images = { R.drawable.cadburysilk, R.drawable.cadburys_dairymilk,
R.drawable.perk, R.drawable.kitkat,
R.drawable.nestlemunchchocolate, R.drawable.cadbury_bournville_bar,
R.drawable.snickers };
ListView list;
DBAdapter dbadapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View rootview = inflater.inflate(R.layout.activity_home_page,
container, false);
View view = View.inflate(getActivity(), R.layout.headerview, null);
Resources res = getResources();
listitems = res.getStringArray(R.array.items);
list = (ListView) rootview.findViewById(R.id.itemslist);
list.addHeaderView(view);
AdapterClass adapterClass = new AdapterClass(this.getActivity(),
listitems, images);
list.setAdapter(adapterClass);
return rootview;
}
}
class AdapterClass extends ArrayAdapter<String> {
Context context;
int[] images;
String[] names;
Button add, sub;
TextView number;
Integer count=0;
static class ViewHolder {
public TextView textView;
public ImageView imageView;
}
public AdapterClass(Context c, String[] items, int imgs[]) {
// TODO Auto-generated constructor stub
super(c, R.layout.rowlayout, R.id.quantity, items);
this.context = c;
this.images = imgs;
this.names = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View row = convertView;
// reuse views
if (row == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.rowlayout, parent, false);
ViewHolder viewHolder = new ViewHolder();
viewHolder.imageView = (ImageView) row.findViewById(R.id.img);
viewHolder.textView = (TextView) row.findViewById(R.id.textView1);
add = (Button) row.findViewById(R.id.button1);
add.setTag(position);
sub = (Button) row.findViewById(R.id.button2);
sub.setTag(position);
number = (TextView)row.findViewById(R.id.quantity);
row.setTag(viewHolder);
}
ViewHolder holder = (ViewHolder) row.getTag();
holder.imageView.setImageResource(images[position]);
holder.textView.setText(names[position]);
add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
count=count+1;
number.setText(count.toString());
}
});
sub.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
count=count-1;
number.setText(count.toString());
}
});
return row;
}
}
请帮忙。我还需要帮助如何在下一个 activity 或片段中显示 textview 包含正数的项目。
我写了一篇短文demo for my answer which you can see here。
示例:
准备就绪后,您可以使用数据源(不是适配器,不是列表视图)来查找数量 > 0 的产品。
public List<Product> getBasket() {
List<Product> basket = new ArrayList<>();
for (Product product : productList) {
if (product.quantity > 0) {
basket.add(product);
}
}
return basket;
}
您的适配器只有一项工作:create/bind 视图到数据,它不需要做更多。
没有演示的初始答案:
如果直接更新项目视图,以后将无法获取所有具有正数的项目,因为这些更新的值仅存储在视图中,而不存储在某些数据中您可以迭代的结构.
这就是为什么您不应该直接更新项目视图,而是在单击 plus/minus 按钮时使用回调,修改基础数据集,然后调用adapter.notifyDatasetChanged()
再次更新 ListView/RecyclerView。
将回调传递给您的适配器:
public interface ItemInteraction {
void onPlusButtonClick(long id);
void onMinusButtonClick(long id);
}
您可以通过将其设置为相关视图上点击侦听器的回调来使用它。 ID可以是任何东西,只要它能唯一标识列表视图行所代表的数据项即可。
final long id = item.getId();
plusButtonView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick() {
callback.onPlusButtonClick(id);
}
});
在这个类似的问题中给出了一个示例,其中 OP 想要显示或隐藏歌曲列表的星号(表示最喜欢的)here。
Another explanation 类适配器视图的设计用途。
按照用户 370305 的回答进行初始查询。
Please help. Also i need help in how to show the items whose textview contains positive number in next activity or fragment.
创建一个数据结构,我正在使用一个 HashMap ,其中键是 String.valueOf(position) ,值是 count int。
您知道这些键,因为它将从位置“0”到 listitem.length。使用密钥,您可以获得计数值并检查正值。
为什么使用 Hashmap:因为每次更改计数时,新值都会被覆盖。 (在hashmap中只维护一个唯一键)。
(position = 0, count = 0) --> - 单击第 0 行 --> (position 0 , count = -1) 将在 key = 0 单元格上被覆盖。
完整代码(固定数字增量并在DataStructure中设置正值):
public class HomePage extends Fragment {
String[] listitems;
int[] images = { R.drawable.cadburysilk, R.drawable.cadburys_dairymilk,
R.drawable.perk, R.drawable.kitkat,
R.drawable.nestlemunchchocolate, R.drawable.cadbury_bournville_bar,
R.drawable.snickers };
ListView list;
DBAdapter dbadapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View rootview = inflater.inflate(R.layout.activity_home_page,
container, false);
View view = View.inflate(getActivity(), R.layout.headerview, null);
Resources res = getResources();
listitems = res.getStringArray(R.array.items);
list = (ListView) rootview.findViewById(R.id.itemslist);
list.addHeaderView(view);
AdapterClass adapterClass = new AdapterClass(this.getActivity(),
listitems, images);
list.setAdapter(adapterClass);
return rootview;
//You can use adapterClass.getPositiveNumber(); to retrieve all positive rows and the values!
//Unique key will be String : 1,2,3....listitems.length.
}
}
class AdapterClass extends ArrayAdapter<String> {
Context context;
int[] images;
String[] names;
Button add, sub;
ViewHolder holder; // Since will be accessed inside onclick
HashMap<String,Integers> positiveNumbers = new HashMap<String,Integers>;
Integer count=0;
static class ViewHolder {
public TextView textView;
public ImageView imageView;
public TextView number;
public String uniqueKey;
}
public AdapterClass(Context c, String[] items, int imgs[]) {
// TODO Auto-generated constructor stub
super(c, R.layout.rowlayout, R.id.quantity, items);
this.context = c;
this.images = imgs;
this.names = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View row = convertView;
// reuse views
if (row == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.rowlayout, parent, false);
ViewHolder viewHolder = new ViewHolder();
viewHolder.imageView = (ImageView) row.findViewById(R.id.img);
viewHolder.textView = (TextView) row.findViewById(R.id.textView1);
viewHolder.number = (TextView)row.findViewById(R.id.quantity);
viewHolder.uniqueKey = String.valueOf(position);
add = (Button) row.findViewById(R.id.button1);
add.setTag(position);
sub = (Button) row.findViewById(R.id.button2);
sub.setTag(position);
row.setTag(viewHolder);
}
holder = (ViewHolder) row.getTag(); //keeping one global memory
holder.imageView.setImageResource(images[position]);
holder.textView.setText(names[position]);
add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
count=count+1;
holder.number.setText(count.toString());
positiveNumbers.put(holder.uniqueKey,count); //Key -> String.valueOf(position) and Value -> int count
}
});
sub.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
count=count-1;
holder.number.setText(count.toString());
positiveNumbers.put(holder.uniqueKey,count); //Key -> String.valueOf(position) and Value -> int count
}
});
return row;
}
public Map<String,Integer> getPositiveNumbers()
{
return positiveNumbers;
}
}
p.s。我输入了编辑器,可能有一些编译时错误。您还可以针对键存储每一行的对象,这样当您获得正计数时,您可以获得任何其他参考,例如图像,我猜您稍后需要显示!
我知道已经很晚了,但我认为这可能会帮助其他有类似问题的人
Problem: I want that if the user clicks on the button + or - the textview which is currently showing 0 is incremented or decremented accordingly. But if I click first item's button the textview is updated in some other row. I don't know how to implement this.
看看你的代码
ViewHolder holder = (ViewHolder) row.getTag();
holder.imageView.setImageResource(images[position]);
holder.textView.setText(names[position]);
add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
count=count+1;
number.setText(count.toString());
}
});
sub.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
count=count-1;
number.setText(count.toString());
}
});
return row;
在您的 ViewHolder 中,您已经为 holder.imageview 和 holder.textview 设置了值,我认为这是名称,但您忘记为 holder.number 设置值并且您只是在更改其值在 onClick 方法中。
因此,当适配器创建其视图时,它找不到任何特定值,这就是它使用以前使用的视图来扩充数据的原因。
解决方案:- 只需使用单独的列表来存储具有唯一键的数字(使用适配器位置作为键)并检查列表是否具有该键,这意味着您之前更改了值,因此从列表中获取值并设置如果密钥不存在,它在 textview 上,这意味着您从未更改过该值,因此将 textview 设置为 0
我已经创建了一个列表视图,如下所示 image.Link:
问题: 我希望如果用户点击按钮 +
或 -
当前显示 0
的文本视图是相应地增加或减少。但是,如果我单击第一个项目的按钮,则文本视图会在其他行中更新。我不知道如何实现这个。
代码如下:
public class HomePage extends Fragment {
String[] listitems;
int[] images = { R.drawable.cadburysilk, R.drawable.cadburys_dairymilk,
R.drawable.perk, R.drawable.kitkat,
R.drawable.nestlemunchchocolate, R.drawable.cadbury_bournville_bar,
R.drawable.snickers };
ListView list;
DBAdapter dbadapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View rootview = inflater.inflate(R.layout.activity_home_page,
container, false);
View view = View.inflate(getActivity(), R.layout.headerview, null);
Resources res = getResources();
listitems = res.getStringArray(R.array.items);
list = (ListView) rootview.findViewById(R.id.itemslist);
list.addHeaderView(view);
AdapterClass adapterClass = new AdapterClass(this.getActivity(),
listitems, images);
list.setAdapter(adapterClass);
return rootview;
}
}
class AdapterClass extends ArrayAdapter<String> {
Context context;
int[] images;
String[] names;
Button add, sub;
TextView number;
Integer count=0;
static class ViewHolder {
public TextView textView;
public ImageView imageView;
}
public AdapterClass(Context c, String[] items, int imgs[]) {
// TODO Auto-generated constructor stub
super(c, R.layout.rowlayout, R.id.quantity, items);
this.context = c;
this.images = imgs;
this.names = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View row = convertView;
// reuse views
if (row == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.rowlayout, parent, false);
ViewHolder viewHolder = new ViewHolder();
viewHolder.imageView = (ImageView) row.findViewById(R.id.img);
viewHolder.textView = (TextView) row.findViewById(R.id.textView1);
add = (Button) row.findViewById(R.id.button1);
add.setTag(position);
sub = (Button) row.findViewById(R.id.button2);
sub.setTag(position);
number = (TextView)row.findViewById(R.id.quantity);
row.setTag(viewHolder);
}
ViewHolder holder = (ViewHolder) row.getTag();
holder.imageView.setImageResource(images[position]);
holder.textView.setText(names[position]);
add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
count=count+1;
number.setText(count.toString());
}
});
sub.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
count=count-1;
number.setText(count.toString());
}
});
return row;
}
}
请帮忙。我还需要帮助如何在下一个 activity 或片段中显示 textview 包含正数的项目。
我写了一篇短文demo for my answer which you can see here。
示例:
准备就绪后,您可以使用数据源(不是适配器,不是列表视图)来查找数量 > 0 的产品。
public List<Product> getBasket() {
List<Product> basket = new ArrayList<>();
for (Product product : productList) {
if (product.quantity > 0) {
basket.add(product);
}
}
return basket;
}
您的适配器只有一项工作:create/bind 视图到数据,它不需要做更多。
没有演示的初始答案:
如果直接更新项目视图,以后将无法获取所有具有正数的项目,因为这些更新的值仅存储在视图中,而不存储在某些数据中您可以迭代的结构.
这就是为什么您不应该直接更新项目视图,而是在单击 plus/minus 按钮时使用回调,修改基础数据集,然后调用adapter.notifyDatasetChanged()
再次更新 ListView/RecyclerView。
将回调传递给您的适配器:
public interface ItemInteraction {
void onPlusButtonClick(long id);
void onMinusButtonClick(long id);
}
您可以通过将其设置为相关视图上点击侦听器的回调来使用它。 ID可以是任何东西,只要它能唯一标识列表视图行所代表的数据项即可。
final long id = item.getId();
plusButtonView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick() {
callback.onPlusButtonClick(id);
}
});
在这个类似的问题中给出了一个示例,其中 OP 想要显示或隐藏歌曲列表的星号(表示最喜欢的)here。
Another explanation 类适配器视图的设计用途。
按照用户 370305 的回答进行初始查询。
Please help. Also i need help in how to show the items whose textview contains positive number in next activity or fragment.
创建一个数据结构,我正在使用一个 HashMap ,其中键是 String.valueOf(position) ,值是 count int。
您知道这些键,因为它将从位置“0”到 listitem.length。使用密钥,您可以获得计数值并检查正值。
为什么使用 Hashmap:因为每次更改计数时,新值都会被覆盖。 (在hashmap中只维护一个唯一键)。
(position = 0, count = 0) --> - 单击第 0 行 --> (position 0 , count = -1) 将在 key = 0 单元格上被覆盖。
完整代码(固定数字增量并在DataStructure中设置正值):
public class HomePage extends Fragment {
String[] listitems;
int[] images = { R.drawable.cadburysilk, R.drawable.cadburys_dairymilk,
R.drawable.perk, R.drawable.kitkat,
R.drawable.nestlemunchchocolate, R.drawable.cadbury_bournville_bar,
R.drawable.snickers };
ListView list;
DBAdapter dbadapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View rootview = inflater.inflate(R.layout.activity_home_page,
container, false);
View view = View.inflate(getActivity(), R.layout.headerview, null);
Resources res = getResources();
listitems = res.getStringArray(R.array.items);
list = (ListView) rootview.findViewById(R.id.itemslist);
list.addHeaderView(view);
AdapterClass adapterClass = new AdapterClass(this.getActivity(),
listitems, images);
list.setAdapter(adapterClass);
return rootview;
//You can use adapterClass.getPositiveNumber(); to retrieve all positive rows and the values!
//Unique key will be String : 1,2,3....listitems.length.
}
}
class AdapterClass extends ArrayAdapter<String> {
Context context;
int[] images;
String[] names;
Button add, sub;
ViewHolder holder; // Since will be accessed inside onclick
HashMap<String,Integers> positiveNumbers = new HashMap<String,Integers>;
Integer count=0;
static class ViewHolder {
public TextView textView;
public ImageView imageView;
public TextView number;
public String uniqueKey;
}
public AdapterClass(Context c, String[] items, int imgs[]) {
// TODO Auto-generated constructor stub
super(c, R.layout.rowlayout, R.id.quantity, items);
this.context = c;
this.images = imgs;
this.names = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View row = convertView;
// reuse views
if (row == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.rowlayout, parent, false);
ViewHolder viewHolder = new ViewHolder();
viewHolder.imageView = (ImageView) row.findViewById(R.id.img);
viewHolder.textView = (TextView) row.findViewById(R.id.textView1);
viewHolder.number = (TextView)row.findViewById(R.id.quantity);
viewHolder.uniqueKey = String.valueOf(position);
add = (Button) row.findViewById(R.id.button1);
add.setTag(position);
sub = (Button) row.findViewById(R.id.button2);
sub.setTag(position);
row.setTag(viewHolder);
}
holder = (ViewHolder) row.getTag(); //keeping one global memory
holder.imageView.setImageResource(images[position]);
holder.textView.setText(names[position]);
add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
count=count+1;
holder.number.setText(count.toString());
positiveNumbers.put(holder.uniqueKey,count); //Key -> String.valueOf(position) and Value -> int count
}
});
sub.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
count=count-1;
holder.number.setText(count.toString());
positiveNumbers.put(holder.uniqueKey,count); //Key -> String.valueOf(position) and Value -> int count
}
});
return row;
}
public Map<String,Integer> getPositiveNumbers()
{
return positiveNumbers;
}
}
p.s。我输入了编辑器,可能有一些编译时错误。您还可以针对键存储每一行的对象,这样当您获得正计数时,您可以获得任何其他参考,例如图像,我猜您稍后需要显示!
我知道已经很晚了,但我认为这可能会帮助其他有类似问题的人
Problem: I want that if the user clicks on the button + or - the textview which is currently showing 0 is incremented or decremented accordingly. But if I click first item's button the textview is updated in some other row. I don't know how to implement this.
看看你的代码
ViewHolder holder = (ViewHolder) row.getTag();
holder.imageView.setImageResource(images[position]);
holder.textView.setText(names[position]);
add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
count=count+1;
number.setText(count.toString());
}
});
sub.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
count=count-1;
number.setText(count.toString());
}
});
return row;
在您的 ViewHolder 中,您已经为 holder.imageview 和 holder.textview 设置了值,我认为这是名称,但您忘记为 holder.number 设置值并且您只是在更改其值在 onClick 方法中。 因此,当适配器创建其视图时,它找不到任何特定值,这就是它使用以前使用的视图来扩充数据的原因。
解决方案:- 只需使用单独的列表来存储具有唯一键的数字(使用适配器位置作为键)并检查列表是否具有该键,这意味着您之前更改了值,因此从列表中获取值并设置如果密钥不存在,它在 textview 上,这意味着您从未更改过该值,因此将 textview 设置为 0