android - 在 Android 的 ListView 中将单击的项目居中

标签 android listview center

我在屏幕左侧有一个 ListView ,单击该项目后我想更新屏幕右半部分的文本,我在这里要做的是将单击的项目移动到屏幕的中心列表显示。就像如果该项目位于顶部并且我单击它它会自动移动到 ListView 的中心,我该怎么做?任何形式的帮助将不胜感激。

我有一个 ListView ,其中有 7 个项目可见,启动时将选择第 4 个项目,因为它位于 ListView 中可见项目的中心,如果有 n 个项目,并且用户选择的任何项目都将位于 ListView 的中心 ListView 中的可见项目。就像我有 10 个项目,在开始时选择第 4 个项目,当用户选择第 3 个项目时, ListView 中的第 n 个项目应该到达索引零,第 3 个项目将到达位置 4。对于每个其他选定的项目是否类似?任何人都可以提供一个代码 fragment 吗?

最佳答案

更改ListViewArray中的项目顺序,然后在ListView适配器中调用notifyDataSetChanged()

>

编辑:代码示例

    public class ListAdapter extends BaseAdapter{


    private Activity activity;
    private ArrayList<ListRowObject> listItems;

    public ListAdapter(Activity activity){
        this.activity = activity;
        listItems = new ArrayList<ListRowObject>();
    }

    public void addItem(ListRowObject item){
        listItems.add(item);
        notifyDataSetChanged();
    }

    public void addItems(ArrayList<ListRowObject> items){
        listItems = items;
        notifyDataSetChanged();
    }

    public void clear(){
        listItems = null;
        listItems = new ArrayList<ListRowObject>();
        notifyDataSetChanged();
    }

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

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {
        ViewHolder holder;

        if(convertView == null){
            holder = new ViewHolder();
            convertView = activity.getLayoutInflater().inflate(R.layout.list_row, null);
            holder.text = (TextView) convertView.findViewById(R.id.text);
            holder.bgLayout = (LinearLayout) convertView.findViewById(R.id.bgLayout);

            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }

        ListRowObject row = listItems.get(position);

        if(row.isSelected())
            holder.bgLayout.setBackgroundColor(Color.GRAY);
        else
            holder.bgLayout.setBackgroundColor(Color.WHITE);

        holder.text.setText(row.getText());

        return convertView;
    }
}


    //--------
    public class ListRowObject {
    private String text;
    private int positionInList;
    private boolean isSelected;

    public String getText() {
        return text;
    }


    public void setText(String text) {
        this.text = text;
    }

    public int getPositionInList() {
        return positionInList;
    }

    public void setPositionInList(int positionInList) {
        this.positionInList = positionInList;
    }

    public boolean isSelected() {
        return isSelected;
    }

    public void setSelected(boolean selected) {
        isSelected = selected;
    }
}

//------
public class Main extends Activity {

    private ListView listView;
    private ListAdapter adapter;
    private Activity activity;

    private ArrayList<ListRowObject> items;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        activity = this;

        initializeFormViews();
        initializeOnClickEvents();

        fillList();

    }

    private void initializeFormViews(){
        listView = (ListView) findViewById(R.id.listView);
    }

    private void initializeOnClickEvents(){
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                Toast.makeText(activity, "Pressed " +position, Toast.LENGTH_SHORT).show();

                // unselect all rows
                for(ListRowObject item : items){
                    item.setSelected(false);
                }

                int first = adapterView.getFirstVisiblePosition();
                int last = adapterView.getLastVisiblePosition();

                int centerPosition = (first + last) / 2;

                // change bg for centerPosition row
                adapterView.getChildAt(centerPosition).findViewById(R.id.bgLayout).setBackgroundColor(Color.GRAY);
                changeItems(position, centerPosition);
            }
        });
    }

    private void changeItems(int pressedPosition, int centerPosition){
        ListRowObject centerRow = items.get(centerPosition);
        ListRowObject pressedRow = items.get(pressedPosition);
        pressedRow.setSelected(true);
        centerRow.setSelected(false);

        items.remove(centerPosition);
        items.add(centerPosition, pressedRow);

        items.remove(pressedPosition);
        items.add(pressedPosition, centerRow);

        adapter.clear();
        adapter.addItems(items);
    }

    private void fillList(){
        adapter = new ListAdapter(activity);
        items = new ArrayList<ListRowObject>();

        items = getItems();

        for(ListRowObject item : items){
            adapter.addItem(item);
        }

        listView.setAdapter(adapter);
    }

    private ArrayList<ListRowObject> getItems(){
        ArrayList<ListRowObject> result = new ArrayList<ListRowObject>();

        for(int i = 0; i < 15; i++){
            ListRowObject object = new ListRowObject();
            object.setPositionInList(i);
            object.setText("Item #" + i);

            if(i != 4)
                object.setSelected(false);
            else
                object.setSelected(true);


            result.add(object);
        }

        return result;
    }
}

//------
public class ViewHolder {
    public TextView text;
    public LinearLayout bgLayout;
}

list_row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                          android:orientation="vertical"
                          android:layout_width="match_parent"
                          android:layout_height="50dp"
                          android:id="@+id/bgLayout">

        <TextView
                        android:layout_width="match_parent"
                        android:layout_height="50dp"
                        android:id="@+id/text"
                        android:textColor="#000000"
                        android:textSize="24dp"
                        android:gravity="center"/>
</LinearLayout>

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                          android:orientation="vertical"
                          android:layout_width="match_parent"
                          android:layout_height="match_parent">

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

关于android - 在 Android 的 ListView 中将单击的项目居中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14039387/

相关文章:

android - 如何删除 textView 上的默认填充?

java - 当我处于不同的 Activity 时如何从 ImageView 更改图像

c# - 无法迭代 Xamarin Forms 中的 ListView 项目

java - 在 ListView 中,所有值都插入到第一个位置

html - 垂直居中表格最好是 CSS

html - 居中对齐包裹在 div 中的两个元素

java - 字符串返回标签而不是格式化文本

java - 无法解析符号 R,setContentView() android studio

Android:Listview 的 onItemClick() 事件未被调用

css - 想要居中一个div