Android: события моего listView onClick не работают должным образом (порядок не работает) - PullRequest
0 голосов
/ 25 июня 2018

Моя программа должна отображать список приложений и их использование данных.Если вы щелкнете по этому приложению, оно откроет новую страницу активности и даст больше информации об этом приложении.На начальной странице все работает отлично, и все приложения показывают точную информацию, но после того, как я прокручиваю вниз, она запутывается - на странице «больше информации» отображается приложение, отличное от того, которое я щелкнул.

Я почти уверенпроблема в том, что событие onclick не привязано к держателю?Однако я не могу понять, что делать там.Следует отметить, что проблема устранена, если я избавлюсь от условия if (convertView == null) / else, но я знаю, что это плохая практика, поскольку мы не хотим продолжать повторную генерацию предыдущих элементов

Вот код getView в моем настраиваемом адаптере:

 public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    final DataUsageModel model;
    model = getItem(position);
    if (convertView == null) {
        holder = new ViewHolder();
        convertView = LayoutInflater.from(context).inflate(R.layout.customlayout, null);

        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intentMoreInfo = new Intent(view.getContext(),MoreInfoActivity.class);
                intentMoreInfo.putExtra("wifiUsage",model.getWifiUsage());
                intentMoreInfo.putExtra("mobileUsage",model.getMobileUsage());
                intentMoreInfo.putExtra("appName",model.getName());
                intentMoreInfo.putExtra("pname",model.getPname());

                context.startActivity(intentMoreInfo);


            }
        });
        holder.nameText = (TextView) convertView.findViewById(R.id.textViewWord);
        holder.totalUsageText = (TextView) convertView.findViewById(R.id.textViewDescription);
        holder.imageView = (ImageView) convertView.findViewById(R.id.iconImageView);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.nameText.setText(model.getName());

    long usageInMB = (model.getWifiUsage() + model.getMobileUsage())/(1024*1024);
    holder.totalUsageText.setText(String.valueOf(usageInMB) + " MB");

    holder.imageView.setImageDrawable(model.getImageRes());
    return convertView;
}

public class ViewHolder {
    TextView nameText;
    TextView totalUsageText;
    ImageView imageView;
}

Вот мой код для начала нового действия:

public class MoreInfoActivity extends AppCompatActivity {
    TextView wifiUsage;
    TextView mobileUsage;
    ImageView icon;
    TextView appName;
    Button backButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.more_info_layout);

    wifiUsage = findViewById(R.id.moreInfoWifi);
    mobileUsage = findViewById(R.id.moreInfoMobile);
    appName = findViewById(R.id.moreInfoAppName);
    icon = findViewById(R.id.moreInfoIcon);

    backButton = (Button)findViewById(R.id.moreInfoBack);
    backButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            finish();
        }
    });

    appName.setText(getIntent().getStringExtra("appName"));
    wifiUsage.setText("Wifi Usage: " + String.valueOf(getIntent().getLongExtra("wifiUsage",0)/(1024*1024)) + " MB");
    mobileUsage.setText("Mobile Usage: " + String.valueOf(getIntent().getLongExtra("mobileUsage",0)/(1024*1024)) + " MB");
    try {
        icon.setImageDrawable(getPackageManager().getApplicationIcon(getIntent().getStringExtra("pname")));
    }catch(PackageManager.NameNotFoundException e){
        e.printStackTrace();
    }

1 Ответ

0 голосов
/ 25 июня 2018

Вы должны установить OnClickListener для каждой итерации метода getView, а не только когда convertView == null .

В вашем случае текущая позиция данных не синхронизирована с текущей позицией представления (держателя) для каждой итерации getView

Кроме того, это очень плохая практика - запускать действие с самого адаптера.Роль адаптера состоит в том, чтобы связывать представление с данными, и это все.

...