Android TextView.setText不';不要使用OnClick方法
我有一个ListView,它驻留在一个片段和中。列表项包含多个布局,每个布局中都有Textview。 我正在使用一个AlertDialog,它应该要求用户编写一些东西,然后当用户单击yes按钮时,代码会用用户编写的内容更改TextView的值。 因此,当用户单击listview的某个项目时,会出现一个AlertDialog,要求用户编写一些内容,并更改该项目的TextView文本 在我的测试代码中,我尝试了一个更简单的版本:出现alertdialog,用户只需单击yes按钮,然后alertdialog将“test”放在TextView中。 代码如下:Android TextView.setText不';不要使用OnClick方法,android,Android,我有一个ListView,它驻留在一个片段和中。列表项包含多个布局,每个布局中都有Textview。 我正在使用一个AlertDialog,它应该要求用户编写一些东西,然后当用户单击yes按钮时,代码会用用户编写的内容更改TextView的值。 因此,当用户单击listview的某个项目时,会出现一个AlertDialog,要求用户编写一些内容,并更改该项目的TextView文本 在我的测试代码中,我尝试了一个更简单的版本:出现alertdialog,用户只需单击yes按钮,然后alertdia
final View rootView =inflater.inflate(R.layout.fragment_notes, container, false);
List<ItemListViewModel1> list = listfiller();
ListView testListView = rootView.findViewById(R.id.idListViewNotes);
testListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
LayoutInflater inflater = requireActivity().getLayoutInflater();
final View edittext_View = inflater.inflate(R.layout.edittext_changement_note,null);
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setTitle(nomNote);
builder.setView(edittext_View);
builder.setPositiveButton("Valider", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
((TextView) view.findViewById(R.id.idTextViewNote)).setText("test");
}
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
}
});
testListView.setAdapter(new ItemListViewAdapter(getContext(),list));
仅当置于setPositiveButton
的Onclick
之外时才起作用。
当此行位于Onclick
内时,Textview将保留其先前的测试
我的问题是如何让它在OnClick
中设置文本
另外,my listfiller()是一个填充列表的函数,但它不是问题的一部分
编辑:根据要求,以下是我的ItemListViewAdapter代码:
public class ItemListViewAdapter extends BaseAdapter {
//fields
private Context context;
private List<ItemListViewModel1> listeItems;
private LayoutInflater inflater;
//constructor
public ItemListViewAdapter(Context context, List<ItemListViewModel1> listeItems){
this.context = context;
this.listeItems = listeItems;
this.inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return listeItems.size();
}
@Override
public ItemListViewModel1 getItem(int position) {
return listeItems.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = inflater.inflate(R.layout.layout_note, null);
//Récupère les infos de l'item pour changer le texte des Textview etc
ItemListViewModel1 currentItem = getItem(position);
//On récupère les fameuses infos
String title = currentItem.getTitle();
String subtitle = currentItem.getSubtitle();
String nombre = currentItem.getNombre();
//On crée les éléments pour en changer les valeurs
TextView titleTextView = convertView.findViewById(R.id.idTextViewNomNote);
titleTextView.setText(title);
TextView subtitleTextView = convertView.findViewById(R.id.idTextViewPole);
subtitleTextView.setText(subtitle);
TextView noteTextView = convertView.findViewById(R.id.idTextViewNote);
noteTextView.setText(nombre);
return convertView;
}
}
公共类ItemListViewAdapter扩展了BaseAdapter{
//田地
私人语境;
私人物品清单;
私人充气机;
//建造师
公共项ListViewAdapter(上下文上下文,列表项){
this.context=上下文;
this.listeItems=listeItems;
this.inflater=layoutiner.from(上下文);
}
@凌驾
public int getCount(){
返回listeItems.size();
}
@凌驾
公共项ListViewModel1获取项(int位置){
返回列表项。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回0;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
convertView=充气机。充气(R.layout.layout_注释,空);
//Récupère les infos de l'item pour changer le texte des Textview等
ItemListViewModel1 currentItem=getItem(位置);
//关于法国名人杯
String title=currentItem.getTitle();
字符串subtitle=currentItem.getSubtitle();
字符串nombre=currentItem.getNombre();
//关于《美丽的情人》杂志
TextView titleTextView=convertView.findViewById(R.id.idTextViewNomNote);
titleTextView.setText(title);
TextView subtitleTextView=convertView.findViewById(R.id.idTextViewPole);
subtitleTextView.setText(subtitle);
TextView noteTextView=convertView.findViewById(R.id.idTextViewNote);
noteTextView.setText(nombre);
返回视图;
}
}
而ItemListViewModel1只是一个包含3个字符串及其get方法的对象当您尝试在肯定按钮的onclick侦听器中访问view对象时,可能会出现编译错误。因为它不是最终的。让我向您展示如何使用一个小补丁使现有代码正常工作
testListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
final TextView tv = view.findViewById(R.id.idTextViewNote);
...
builder.setPositiveButton("Valider", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
tv.setText("test");
}
});
builder.show();
}
});
testListView.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
最终文本视图tv=view.findViewById(R.id.idTextViewNote);
...
setPositiveButton(“Valider”,新的DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
tv.setText(“测试”);
}
});
builder.show();
}
});
推荐解决方案
上述解决方案只会使现有代码正常工作,但当数据大小增加时,它将不会持久。因此,更好的方法是更改数据集并通知适配器。这是示例代码
testListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
final ItemListViewModel1 item = (ItemListViewModel1) adapterView.getItemAtPosition(position);;
final BaseAdapter adapter = (BaseAdapter) adapterView.getAdapter();
...
builder.setPositiveButton("Valider", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
item.setNombre("test");
adapter.notifyDataSetChanged();
}
});
builder.show();
}
});
testListView.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
final ItemListViewModel1 item=(ItemListViewModel1)adapterView.getItemAtPosition(position);;
最终BaseAdapter=(BaseAdapter)adapterView.getAdapter();
...
setPositiveButton(“Valider”,新的DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
项目.设置名称(“测试”);
adapter.notifyDataSetChanged();
}
});
builder.show();
}
});
要更改textview值,必须更改listview使用的基础数据存储,然后调用notifyDatasetChange()。你能发布你的ItemListViewAdapter代码吗?当然,我把它添加到了我的帖子中,寻找编辑。事实上,我没有成功地使用你的第一个解决方案,但是推荐的解决方案工作得很好
testListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
final ItemListViewModel1 item = (ItemListViewModel1) adapterView.getItemAtPosition(position);;
final BaseAdapter adapter = (BaseAdapter) adapterView.getAdapter();
...
builder.setPositiveButton("Valider", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
item.setNombre("test");
adapter.notifyDataSetChanged();
}
});
builder.show();
}
});