适配器中第二个元素的位置错误
wrong position for second element in adapter
我有一个自定义适配器,单击时,所有返回的位置都是正确的,除了第二个,它应该是 1 但实际上是 0(与第一个元素相同)。我尝试使用 v.getTag() 而不是直接使用位置,但它仍然给我相同的结果。适配器的一些背景知识:我的 ConnectedDeviceActivity 向适配器发送 "All"、"No Connected Device" 或设备名称。根据点击的项目,它调用 AnalysisActivity,显示与点击项目相关的数据图表。这是我的代码:
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class AnalysisAdapter extends ArrayAdapter{
private List appliance = new ArrayList<>();
private List animation = new ArrayList<>();
private String[] lookupName = {"heater", "dishwasher", "charger", "fridge"};
private Context c;
public AnalysisAdapter(Context context, int resource)
{
super(context, resource);
this.c = context;
}
public void add(String newAppliance)
{
if(newAppliance.equals("All") || newAppliance.equals("No Connected Device"))
{
Log.d("Adapter", newAppliance + " added with position " + -1);
appliance.add(newAppliance);
animation.add(-1);
super.add(newAppliance);
}
else
{
int position = 0;
for (int i = 0; i < lookupName.length; i++)
{
if (lookupName[i].equals(newAppliance))
{
position = i;
i = lookupName.length;
}
}
Log.d("Adapter", newAppliance + " added with position " + position);
appliance.add(newAppliance);
animation.add(position);
super.add(newAppliance);
}
}
public boolean isAlreadyInList(String testAppliance) { return this.appliance.contains(testAppliance);}
static class RowHolder
{
TextView APPLIANCE;
ImageView ANIMATION;
}
@Override
public int getCount()
{
return this.appliance.size();
}
@Override
public Object getItem(int position)
{
return this.appliance.get(position);
}
public void remove(String removeAppliance)
{
int removePosition = appliance.indexOf(removeAppliance);
appliance.remove(removeAppliance);
animation.remove(removePosition);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row;
row = convertView;
RowHolder holder;
final int currentPosition = position;
//Inflate row
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.analysis_item, parent, false);
holder = new RowHolder();
holder.APPLIANCE = (TextView) row.findViewById(R.id.analysis_item_text);
holder.ANIMATION = (ImageView) row.findViewById(R.id.animation_item_image);
holder.APPLIANCE.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for(int i = 0; i < appliance.size(); i ++)
Log.d("Adapter", "All appliance in order: " + appliance.get(i));
Log.d("Adapter", appliance.get(currentPosition) + " send to analysis with position " + currentPosition );
Intent intent= new Intent(c, AnalysisActivity.class);
intent.putExtra("DEVICENAME", (String) appliance.get(currentPosition));
intent.putExtra("STARTINGACTIVITY", "ConnectedDeviceActivity");
c.startActivity(intent);
}
});
row.setTag(holder);
} else
holder = (RowHolder) row.getTag();
//Display name
String EM = (String) getItem(position);
holder.APPLIANCE.setText(EM);
int deviceID = (int) animation.get(position);
if (deviceID == 0) //heater
holder.ANIMATION.setBackgroundColor(Color.GREEN);
else if (deviceID == 1) //dishwasher
holder.ANIMATION.setBackgroundColor(Color.YELLOW);
else if (deviceID == 2) //charger
holder.ANIMATION.setBackgroundColor(Color.RED);
else if (deviceID == 3)//fridge
holder.ANIMATION.setBackgroundColor(Color.BLUE);
return row;
}
}
单击列表中的第二个元素(位置应为 1)时,日志显示以下内容。结果显示我的设备列表是正确的,但是点击的项目被标记为0。其余的位置都是正确的。可能还需要提及的是,适配器的元素是由 ConnectedDeviceActivity 中的侦听器添加的,这些侦听器从在线数据库获取信息。
D/DailyAdapter: All appliance in order: All
D/DailyAdapter: All appliance in order: charger
D/DailyAdapter: All appliance in order: dishwasher
D/DailyAdapter: All appliance in order: fridge
D/DailyAdapter: All appliance in order: heater
D/DailyAdapter: All send to analysis with position 0
在我的第二次尝试中,我在 holder 之后添加了第一行,并使用了索引而不是 currentPosition。日志保持不变
holder.APPLIANCE.setTag(position);
int index = (int) v.getTag();
Log.d("Adapter", appliance.get(index) + " send to analysis with position " + index);
这是单击第 3 个元素(位置 2)时的日志:
D/Adapter: All appliance in order: All
D/Adapter: All appliance in order: charger
D/Adapter: All appliance in order: dishwasher
D/Adapter: All appliance in order: fridge
D/Adapter: All appliance in order: heater
D/Adapter: dishwasher send to analysis with position 2
如果一定要获取被点击行在列表中的点击位置,获取起来很简单。更改此行
int index = (int) v.getTag();
和
int index = position;
您正在使用您的这种方法获取视图的位置 -
getView(int position, View convertView, ViewGroup parent)
只需将此位置用作您的行的位置即可。
您还需要知道 getView 方法中的 convertView 是什么,如果您正在检查 if(convertView == null) 在你的适配器代码中。
See the details here.
请注意,您在此行中显示索引。
Log.d("Adapter", appliance.get(currentPosition) + "发送到带位置的分析" + index );
您的索引仅在此处更新一次
int 索引 = (int) v.getTag();
因为 v.setTag() 仅在 convertView == null 为 true 时设置一次 (这里position总是0)
现在,这是 v.imp -
这段代码全部保存到这里
row.setTag(持有人);
并像这样检索-
holder = (RowHolder) row.getTag();
所以无论你点击哪一行,它总是打印 0。
U 可以打印 position 或 currentPosition 或更新每一行的索引。
我有一个自定义适配器,单击时,所有返回的位置都是正确的,除了第二个,它应该是 1 但实际上是 0(与第一个元素相同)。我尝试使用 v.getTag() 而不是直接使用位置,但它仍然给我相同的结果。适配器的一些背景知识:我的 ConnectedDeviceActivity 向适配器发送 "All"、"No Connected Device" 或设备名称。根据点击的项目,它调用 AnalysisActivity,显示与点击项目相关的数据图表。这是我的代码:
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class AnalysisAdapter extends ArrayAdapter{
private List appliance = new ArrayList<>();
private List animation = new ArrayList<>();
private String[] lookupName = {"heater", "dishwasher", "charger", "fridge"};
private Context c;
public AnalysisAdapter(Context context, int resource)
{
super(context, resource);
this.c = context;
}
public void add(String newAppliance)
{
if(newAppliance.equals("All") || newAppliance.equals("No Connected Device"))
{
Log.d("Adapter", newAppliance + " added with position " + -1);
appliance.add(newAppliance);
animation.add(-1);
super.add(newAppliance);
}
else
{
int position = 0;
for (int i = 0; i < lookupName.length; i++)
{
if (lookupName[i].equals(newAppliance))
{
position = i;
i = lookupName.length;
}
}
Log.d("Adapter", newAppliance + " added with position " + position);
appliance.add(newAppliance);
animation.add(position);
super.add(newAppliance);
}
}
public boolean isAlreadyInList(String testAppliance) { return this.appliance.contains(testAppliance);}
static class RowHolder
{
TextView APPLIANCE;
ImageView ANIMATION;
}
@Override
public int getCount()
{
return this.appliance.size();
}
@Override
public Object getItem(int position)
{
return this.appliance.get(position);
}
public void remove(String removeAppliance)
{
int removePosition = appliance.indexOf(removeAppliance);
appliance.remove(removeAppliance);
animation.remove(removePosition);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row;
row = convertView;
RowHolder holder;
final int currentPosition = position;
//Inflate row
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.analysis_item, parent, false);
holder = new RowHolder();
holder.APPLIANCE = (TextView) row.findViewById(R.id.analysis_item_text);
holder.ANIMATION = (ImageView) row.findViewById(R.id.animation_item_image);
holder.APPLIANCE.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for(int i = 0; i < appliance.size(); i ++)
Log.d("Adapter", "All appliance in order: " + appliance.get(i));
Log.d("Adapter", appliance.get(currentPosition) + " send to analysis with position " + currentPosition );
Intent intent= new Intent(c, AnalysisActivity.class);
intent.putExtra("DEVICENAME", (String) appliance.get(currentPosition));
intent.putExtra("STARTINGACTIVITY", "ConnectedDeviceActivity");
c.startActivity(intent);
}
});
row.setTag(holder);
} else
holder = (RowHolder) row.getTag();
//Display name
String EM = (String) getItem(position);
holder.APPLIANCE.setText(EM);
int deviceID = (int) animation.get(position);
if (deviceID == 0) //heater
holder.ANIMATION.setBackgroundColor(Color.GREEN);
else if (deviceID == 1) //dishwasher
holder.ANIMATION.setBackgroundColor(Color.YELLOW);
else if (deviceID == 2) //charger
holder.ANIMATION.setBackgroundColor(Color.RED);
else if (deviceID == 3)//fridge
holder.ANIMATION.setBackgroundColor(Color.BLUE);
return row;
}
}
单击列表中的第二个元素(位置应为 1)时,日志显示以下内容。结果显示我的设备列表是正确的,但是点击的项目被标记为0。其余的位置都是正确的。可能还需要提及的是,适配器的元素是由 ConnectedDeviceActivity 中的侦听器添加的,这些侦听器从在线数据库获取信息。
D/DailyAdapter: All appliance in order: All
D/DailyAdapter: All appliance in order: charger
D/DailyAdapter: All appliance in order: dishwasher
D/DailyAdapter: All appliance in order: fridge
D/DailyAdapter: All appliance in order: heater
D/DailyAdapter: All send to analysis with position 0
在我的第二次尝试中,我在 holder 之后添加了第一行,并使用了索引而不是 currentPosition。日志保持不变
holder.APPLIANCE.setTag(position);
int index = (int) v.getTag();
Log.d("Adapter", appliance.get(index) + " send to analysis with position " + index);
这是单击第 3 个元素(位置 2)时的日志:
D/Adapter: All appliance in order: All
D/Adapter: All appliance in order: charger
D/Adapter: All appliance in order: dishwasher
D/Adapter: All appliance in order: fridge
D/Adapter: All appliance in order: heater
D/Adapter: dishwasher send to analysis with position 2
如果一定要获取被点击行在列表中的点击位置,获取起来很简单。更改此行
int index = (int) v.getTag();
和
int index = position;
您正在使用您的这种方法获取视图的位置 -
getView(int position, View convertView, ViewGroup parent)
只需将此位置用作您的行的位置即可。
您还需要知道 getView 方法中的 convertView 是什么,如果您正在检查 if(convertView == null) 在你的适配器代码中。 See the details here.
请注意,您在此行中显示索引。
Log.d("Adapter", appliance.get(currentPosition) + "发送到带位置的分析" + index );
您的索引仅在此处更新一次
int 索引 = (int) v.getTag();
因为 v.setTag() 仅在 convertView == null 为 true 时设置一次 (这里position总是0)
现在,这是 v.imp -
这段代码全部保存到这里
row.setTag(持有人);
并像这样检索-
holder = (RowHolder) row.getTag();
所以无论你点击哪一行,它总是打印 0。
U 可以打印 position 或 currentPosition 或更新每一行的索引。