java - 如何从自定义 ListView 中获取特定 View 并更改属性?

标签 java android android-listview

我正在创建一个具有两个 View 的自定义 ListView : ImageView 和 TextView 。一切正常,但我想访问 ListView 的特定位置以更改可见性。

我尝试了这个方法,但不起作用。

private void updateView(int index){
//        View v = mListView.getChildAt(index-mListView.getFirstVisiblePosition());

        View v = mListView.getAdapter().getView(index-mListView.getFirstVisiblePosition(), null, mListView);
        if (v==null){ return; }
        ImageView imageView = Objects.requireNonNull(v).findViewById(R.id.listview_image);
        imageView.setAlpha(0.2f);
        imageView.setVisibility(View.GONE);
    }

这是我的全部代码:

package com.example

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.media.Image;
import android.preference.PreferenceManager;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

import com.taozen.quithabit.MainActivity;
import com.taozen.quithabit.R;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;

public class AchievmentsActivity extends AppCompatActivity {

//    public static void main(String[] args) { }

    // Array of strings for ListView Title
    String[] titles = new String[] {
            "Recruit lvl I", "Recruit lvl II", "Recruit lvl III", "Recruit Master",
            "Silver lvl I", "Silver lvl II", "Silver lvl III", "Silver Nova Master",
            "Gold lvl I", "Gold lvl II", "Gold lvl III", "Gold lvl IV", "Gold Nova Master"};

    int[] images = new int[] {
            R.mipmap.chevron7, R.mipmap.chevron8, R.mipmap.chevron9, R.mipmap.chevron11,
            R.mipmap.chevron16, R.mipmap.chevron17, R.mipmap.chevron18, R.mipmap.chevron10,
            R.mipmap.chevron3, R.mipmap.chevron4, R.mipmap.chevron5, R.mipmap.chevron6, R.mipmap.chevron12};

    String[] descriptions = new String[] {
            "Android ListView Short Bronze LvL I", "Android ListView Short Bronze LvL II", "Android ListView Short Bronze LvL III", "Android ListView Short Bronze LvL IV",
            "Android ListView Short Silver LvL I", "Android ListView Short Silver LvL II", "Android ListView Short Silver LvL III", "Android ListView Short Silver LvL IV",
            "Android ListView Short Description", "Android ListView Short Description", "Android ListView Short Description", "Android ListView Short Description",
    "Only for those who are worthy!"};

    //shared pref
    private SharedPreferences preferences;
    private SharedPreferences.Editor editor;

    HashMap<String, String> hm;
//    SimpleAdapter simpleAdapter;
    ListView mListView;

    @SuppressLint("CommitPrefEdits")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_achievments);

        //shared pref
        preferences = PreferenceManager.getDefaultSharedPreferences(AchievmentsActivity.this);
        editor = preferences.edit();

        getWindow().setStatusBarColor(ContextCompat.getColor(AchievmentsActivity.this, R.color.white));
        //TOOLBAR
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);

//        List<HashMap<String, String>> aList = new ArrayList<>();
//
//        for (int i = 0; i < images.length; i++) {
//            hm = new HashMap<>();
//            hm.put("listview_title", titles[i]);
//            hm.put("listview_discription", descriptions[i]);
//            hm.put("listview_image", Integer.toString(images[i]));
//            aList.add(hm);
//        }

        mListView = findViewById(R.id.list_view);
        CustomAdapterListView customAdapterListView = new CustomAdapterListView(this, titles, images);
        mListView.setAdapter(customAdapterListView);



        if (preferences.contains("rank")){
            if (Objects.requireNonNull(preferences.getString("rank", "")).equalsIgnoreCase("Recruit")) {
                updateView(3);
            }
        }
    }

    private void updateView(int index){
//        View v = mListView.getChildAt(index-mListView.getFirstVisiblePosition());

        View v = mListView.getAdapter().getView(index-mListView.getFirstVisiblePosition(), null, mListView);
        if (v==null){ return; }
        ImageView imageView = Objects.requireNonNull(v).findViewById(R.id.listview_image);
        imageView.setAlpha(0.2f);
        imageView.setVisibility(View.GONE);
    }

    @Override
    public boolean onSupportNavigateUp() {
        onBackPressed();
        return true;
    }
    class CustomAdapterListView extends BaseAdapter {
        String [] result;
        Context context;
        int [] imageId;
        private LayoutInflater inflater=null;
        public CustomAdapterListView(AchievmentsActivity mainActivity, String[] prgmNameList, int[] prgmImages) {
            // TODO Auto-generated constructor stub
            result=prgmNameList;
            context=mainActivity;
            imageId=prgmImages;
            inflater = ( LayoutInflater )context.
                    getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        public int getCount() {
            return images.length;
        }
        @Override
        public Object getItem(int position) {
            return position;
        }
        @Override
        public long getItemId(int position) {
            return 0;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Holder holder=new Holder();
            View view;
            view = inflater.inflate(R.layout.list_item, null);
            holder.img = view.findViewById(R.id.listview_image);
            holder.tv = view.findViewById(R.id.listview_item_title);
            holder.img.setImageResource(images[position]);
            holder.tv.setText(titles[position]);
            return view;
        }
    }
    public class Holder {
        TextView tv;
        ImageView img;
    }

}

例如:如果首选项包含“rank”,那么我想将 Alpha(0.2f) 设置为 ListView 中的位置 0 到 5。

最佳答案

根据您的代码,您需要将以下行添加到 getView 方法的末尾

CustomAdapterListView

    if (Objects.requireNonNull(preferences.getString("rank", "")).equalsIgnoreCase("Recruit")
            && position <= 5) //will check the item position
    {
        //setAlpha or do anything you want if the Rank is Recruit and position is lesser or equal to 5
        holder.img.setAlpha(0.2f);
    } else
    {
        //else do the remaining part
    }

    return view;

关于java - 如何从自定义 ListView 中获取特定 View 并更改属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57561967/

相关文章:

java - Gradle 中“提供”的依赖项

android - com.android.tools.r8.errors.CompilationError : Program type already present: androidx. annotation.AnimRes

android - 关于列表行中 ListView 和 LinearLayout 的可聚焦性

android - 选中上一行的复选框时在 ListView 中显示下一行

java - POP3 RFC : Server sending a non standard response

java - 为什么这两段相似的代码会产生不同的结果呢?

java - Jasper 报告在 netbeans 中工作正常,但在部署为 jar 应用程序时出现异常

android - 在 ImageView 中加载多个图像

android - 如何使用 Android Studio 为 newInstance Fragments 创建一个 kotlin live 模板

android - 在 ListView 中显示来自 URL 的图像