Listview-单击标题以显示描述

问题描述 投票:1回答:2

我正在Android上做Dream应用。我有一个ListView视图,其中包含标题和说明,这些标题和说明存储在单独的TextView中。我希望标题显示在listView视图中,并且仅在单击其中之一以显示描述之后才显示。在按下另一个标题后,我希望前面的描述折叠起来并显示另一个附加到给定标题的描述。

我想让我的笔记看起来像这样:Android dream

这是我的适配器类,我认为需要添加几行来解决我的问题

class SennikListAdapter extends BaseAdapter implements Filterable {
private ArrayList<Sennik> mOriginalValues; // Original Values
private ArrayList<Sennik> mDisplayedValues;    // Values to be displayed
LayoutInflater inflater;


public SennikListAdapter(Context context, ArrayList<Sennik> mProductArrayList) {
    this.mOriginalValues = mProductArrayList;
    this.mDisplayedValues = mProductArrayList;
    inflater = LayoutInflater.from(context);
}

@Override
public int getCount() {
    return mDisplayedValues.size();
}

@Override
public Object getItem(int position) {
    return position;
}

@Override
public long getItemId(int position) {
    return position;
}

private class ViewHolder {
    RelativeLayout llContainer;
    TextView titleOfDream, descriptionOfDream;
}


@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    ViewHolder holder = null;

    if (convertView == null) {

        holder = new ViewHolder();
        convertView = inflater.inflate(R.layout.customlayout, null);
        holder.llContainer = (RelativeLayout) convertView.findViewById(R.id.llContainer);
        holder.titleOfDream = (TextView) convertView.findViewById(R.id.titleTextView);
        holder.descriptionOfDream = (TextView) convertView.findViewById(R.id.descriptionTextView);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.titleOfDream.setText(mDisplayedValues.get(position).getTitleOfDream());
    holder.descriptionOfDream.setText(mDisplayedValues.get(position).getDescriptionOfDream() + "");

    return convertView;
}

我想在getView方法中做类似的事情,但是有一个错误“ Veryable'holder'从内部类内部访问,需要最终确定”。如果我更改为final仍然不起作用

  holder.titleOfDream.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (holder.descriptionOfDream.getVisibility() == View.GONE)
            {
                //expandedChildList.set(arg2, true);
                holder.descriptionOfDream.setVisibility(View.VISIBLE);
            }
            else
            {
                //expandedChildList.set(arg2, false);
                holder.descriptionOfDream.setVisibility(View.GONE);
            }

        }
    });

您对如何执行此操作有任何想法吗?我检查了很多教程,但没有找到,我确定这并不困难:(

也许这会有所帮助这是片段类

public class SennikFragment extends Fragment {

private List<String> fileName;
private List<String> fileContent;
private ArrayList<Sennik> sen = new ArrayList<Sennik>();
private SennikListAdapter adapter;
private EditText editText;
private ListView listView;
private AssetManager assets;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_sennik, container, false);

    // inicjalizacja pól
    fileName = new ArrayList<>();
    fileContent = new ArrayList<>();
    editText=(EditText) view.findViewById(R.id.searchFilter);
    listView=(ListView) view.findViewById(R.id.listView);
    assets = getActivity().getAssets();

    //dodanie do pola wyszukiwania obiektu nasłuchującego zmian w tekście
    editText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (adapter != null) {
                adapter.getFilter().filter(s.toString());
            } else {
                Log.d("filter", "no filter availible");
            }
        }
        @Override
        public void afterTextChanged(Editable s) {

        }
    });

    //uzupełnienie listy tytułów i opisów snu z folderu assets
    try {
        //Pobranie nazw wszystkich plików
        String[] paths = assets.list("");
        String text="";

        /* Usunięcie z nazw plików ich rozszerzenia formatu */
        for (String path : paths) {
            if (path.equals("images") || path.equals("sounds") || path.equals("webkit"))
                continue;
            fileName.add(path.replace(".txt", "  "));
            InputStream is= assets.open(path);
            int size=is.available();
            byte[]buffer=new byte[size];
            is.read(buffer);
            is.close();
            text=new String(buffer);
            fileContent.add(text);
        }

    } catch (IOException ex) {
        Log.e(TAG, "Bład podczas ładowania plików", ex);
    }

    //dodanie do listy z modelu Sennik tytułów i opisów snu
    for(int i=0; i<fileName.size(); i++){
         sen.add(new Sennik(fileName.get(i), fileContent.get(i)));
    }

    adapter=new SennikListAdapter((Context)getActivity(),sen);
    listView.setAdapter(adapter);

    return view;
}

}

这是描述类

public class Sennik {
private String titleOfDream;
private String descriptionOfDream;

public Sennik(String titleOfDream, String descriptionOfDream) {
    this.titleOfDream = titleOfDream;
    this.descriptionOfDream = descriptionOfDream;
}

public String getTitleOfDream() {
    return titleOfDream;
}

public void setTitleOfDream(String titleOfDream) {
    this.titleOfDream = titleOfDream;
}

public String getDescriptionOfDream() {
    return descriptionOfDream;
}

public void setDescriptionOfDream(String descriptionOfDream) {
    this.descriptionOfDream = descriptionOfDream;
}

}和我的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:id="@+id/llContainer">
<TextView
    android:id="@+id/titleTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:textSize="20dp"
    android:textColor="@color/colorAccent"
    android:text="TextView" />

<TextView
    android:id="@+id/descriptionTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/titleTextView"
    android:layout_centerHorizontal="true"
    android:textColorHighlight="@color/colorPrimary"
    android:textStyle="italic"
    android:gravity="center"
    android:textColor="@color/colorPrimary"
    android:text="TextView" />

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<EditText
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:id="@+id/searchFilter"></EditText>

<ListView
    android:id="@+id/listView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@id/searchFilter">


</ListView>

编辑问题解决了!我只是在Adapter类中添加一行以隐藏描述

holder.descriptionOfDream.setVisibility(View.GONE);

所以整个Adapter类看起来像:

class SennikListAdapter extends BaseAdapter implements Filterable {
private ArrayList<Sennik> mOriginalValues; // Original Values
private ArrayList<Sennik> mDisplayedValues;    // Values to be displayed
LayoutInflater inflater;


public SennikListAdapter(Context context, ArrayList<Sennik> mProductArrayList) {
    this.mOriginalValues = mProductArrayList;
    this.mDisplayedValues = mProductArrayList;
    inflater = LayoutInflater.from(context);
}

@Override
public int getCount() {
    return mDisplayedValues.size();
}

@Override
public Object getItem(int position) {
    return position;
}

@Override
public long getItemId(int position) {
    return position;
}

private class ViewHolder {
    RelativeLayout llContainer;
    TextView titleOfDream, descriptionOfDream;
}


@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    ViewHolder holder = null;


    if (convertView == null) {

        holder = new ViewHolder();
        convertView = inflater.inflate(R.layout.customlayout, null);
        holder.llContainer = (RelativeLayout) convertView.findViewById(R.id.llContainer);
        holder.titleOfDream = (TextView) convertView.findViewById(R.id.titleTextView);
        holder.descriptionOfDream = (TextView) convertView.findViewById(R.id.descriptionTextView);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.titleOfDream.setText(mDisplayedValues.get(position).getTitleOfDream());
    holder.descriptionOfDream.setText(mDisplayedValues.get(position).getDescriptionOfDream() + "");
    holder.descriptionOfDream.setVisibility(View.GONE);

    return convertView;

}

并且在Fragment类中,我在listView上使用setOnItemClickListener方法(setOnClickListener不起作用)

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            TextView descriptionOfDream= (TextView) view.findViewById(R.id.descriptionTextView);
            if(descriptionOfDream.getVisibility()==view.GONE){
                descriptionOfDream.setVisibility(view.VISIBLE);
            }
            else
            {
                descriptionOfDream.setVisibility(view.GONE);
            }

        }
    });

所以整个Fragment类看起来像:

   public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_sennik, container, false);

    // inicjalizacja pól
    fileName = new ArrayList<>();
    fileContent = new ArrayList<>();
    editText=(EditText) view.findViewById(R.id.searchFilter);
    listView=(ListView) view.findViewById(R.id.listView);
    assets = getActivity().getAssets();

    //dodanie do pola wyszukiwania obiektu nasłuchującego zmian w tekście
    editText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (adapter != null) {
                adapter.getFilter().filter(s.toString());
            } else {
                Log.d("filter", "no filter availible");
            }
        }
        @Override
        public void afterTextChanged(Editable s) {

        }
    });

    //uzupełnienie listy tytułów i opisów snu z folderu assets
    try {
        //Pobranie nazw wszystkich plików
        String[] paths = assets.list("");
        String text="";

        /* Usunięcie z nazw plików ich rozszerzenia formatu */
        for (String path : paths) {
            if (path.equals("images") || path.equals("sounds") || path.equals("webkit"))
                continue;
            fileName.add(path.replace(".txt", "  "));
            InputStream is= assets.open(path);
            int size=is.available();
            byte[]buffer=new byte[size];
            is.read(buffer);
            is.close();
            text=new String(buffer);
            fileContent.add(text);
        }

    } catch (IOException ex) {
        Log.e(TAG, "Bład podczas ładowania plików", ex);
    }

    //dodanie do listy z modelu Sennik tytułów i opisów snu
    for(int i=0; i<fileName.size(); i++){
         sen.add(new Sennik(fileName.get(i), fileContent.get(i)));
    }

    adapter=new SennikListAdapter((Context)getActivity(),sen);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            TextView descriptionOfDream= (TextView) view.findViewById(R.id.descriptionTextView);
            if(descriptionOfDream.getVisibility()==view.GONE){
                descriptionOfDream.setVisibility(view.VISIBLE);
            }
            else
            {
                descriptionOfDream.setVisibility(view.GONE);
            }

        }
    });

    return view;
}

}

出色的作品<3

java android listview
2个回答
0
投票

您必须在代码中调用此方法`

holder.descriptionOfDream.requestLayout();

因此,基本上,您的新代码如下:>

holder.titleOfDream.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (holder.descriptionOfDream.getVisibility() == View.GONE)
        {
            //expandedChildList.set(arg2, true);
            holder.descriptionOfDream.setVisibility(View.VISIBLE);
            holder.descriptionOfDream.requestLayout();
        }
        else
        {
            //expandedChildList.set(arg2, false);
            holder.descriptionOfDream.setVisibility(View.GONE);
            holder.descriptionOfDream.requestLayout();
        }

    }
});

希望有帮助。请记住,holder变量必须像下面一样是最终变量

final ViewHolder holder = null;

if (convertView == null) {

    holder = new ViewHolder();
    convertView = inflater.inflate(R.layout.customlayout, null);
    holder.llContainer = (RelativeLayout) convertView.findViewById(R.id.llContainer);
    holder.titleOfDream = (TextView) convertView.findViewById(R.id.titleTextView);
    holder.descriptionOfDream = (TextView) convertView.findViewById(R.id.descriptionTextView);
    convertView.setTag(holder);
} else {
    holder = (ViewHolder) convertView.getTag();
}
holder.titleOfDream.setText(mDisplayedValues.get(position).getTitleOfDream());
holder.descriptionOfDream.setText(mDisplayedValues.get(position).getDescriptionOfDream() + "");

return convertView;

1
投票

首先,您需要创建一个Extender LinearLayout类,并进行一些扩展/折叠它的功能。然后将您的描述Textview定义为其子项。

© www.soinside.com 2019 - 2024. All rights reserved.