【问题标题】:How to build a GridViewAdapter correctly?如何正确构建 GridViewAdapter?
【发布时间】:2017-03-15 12:51:44
【问题描述】:

我尝试创建一个带有 6 个按钮的 GridView,我想在按钮上显示 6 个不同的名称。

这是我的带有 GridView 的 activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.aaron.waller.girdlayoutmanagertest.MainActivity">


    <GridView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/gridView"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:numColumns="auto_fit"
        android:horizontalSpacing="10dp"
        android:verticalSpacing="10dp"
        android:columnWidth="120dp"
        android:stretchMode="spacingWidthUniform"/>
</RelativeLayout>

这里是 single_item.xml(在这种情况下它只是一个普通的 Button):

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

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="Button" />
</RelativeLayout>

这是我的带有 6 个名称的 strings.xml:

<resources>
    <string name="app_name">GirdLayoutManagerTest</string>
    <string-array name="button_names">
        <item>Name1</item>
        <item>Name2</item>
        <item>Name3</item>
        <item>Name4</item>
        <item>Name5</item>
        <item>Name6</item>
    </string-array>
</resources>

最后是我的 MainActivity.java:

import android.content.Context;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    GridView gridView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        gridView =(GridView)findViewById(R.id.gridView);
        gridView.setAdapter(new GridAdapter(this));
    }
}
class ButtonNames{

    String buttonNames;
    ButtonNames(String buttonNames){

        this.buttonNames = buttonNames;
    }
}
class GridAdapter extends BaseAdapter{

    ArrayList<ButtonNames> list;
    Context context;
    GridAdapter(Context context){
        this.context = context;
        list= new ArrayList<ButtonNames>();
        Resources res = context.getResources();
        String[] tempButtonNames = res.getStringArray(R.array.button_names);
        for(int i = 0; i<6; i++){
            ButtonNames tempButton = new ButtonNames(tempButtonNames[i]);
            list.add(tempButton);
        }

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

    @Override
    public Object getItem(int i) {
        return list.get(i);
    }

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

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        View row = view;
        if(row == null){
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.single_item, viewGroup, false);


        }else{
            row.getTag();
        }

        return row;
    }
}

我只是得到这个输出: https://gyazo.com/1495d3f0c11e6eb0e903e79a68e7f2b0

如何在按钮上设置 6 个名称?

P.S 我是 Android Studio 的新手。

【问题讨论】:

  • 试试 tempButton.settext(tempButtonNames[i].toString());在for循环中
  • @ZakiPathan "无法解析方法'settext'"

标签: android gridview android-adapter gridlayoutmanager main-activity


【解决方案1】:

更新 GridAdapter 的 getView() 方法:

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    View row = view;
    if(row == null){
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = inflater.inflate(R.layout.single_item, viewGroup, false);

        //ADD THESE LINES
        Button btn = (Button) row.findViewById(R.id.button);
        btn.setText(list.get(i));

    }else{
        row.getTag();
    }

    return row;
}

【讨论】:

    【解决方案2】:

    为什么要使用Gridview。Android为Recyclerview提供了这个功能。如果你接触过recyclerview,你只需要设置GridLayoutManager而不是LinearLayoutManager。

    GridLayoutManager lLayout = new GridLayoutManager(this, 2); yourRecyclerView.setLayoutManager(lLayout);

    其余的将与您在 Recyclerview 适配器中设置的数据相同。

    将您的 activity_main.xml 更改为此。

        <android.support.v7.widget.RecyclerView   xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    

    像这样修改你的 MainActivity.java。

    公共类 MainActivity 扩展 AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main1);
        initComponents();
    }
    
    
    private void initComponents() {
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new GridLayoutManager(this, 2));
        recyclerView.setAdapter(new GridAdapter(this));
    }
    
    class GridAdapter extends RecyclerView.Adapter<GridAdapter.ViewHolder> {
    
        private final LayoutInflater layoutInflater;
        String[] tempButtonNames;
        Context context;
    
        GridAdapter(Context activity) {
            context = activity;
            Resources res = context.getResources();
            tempButtonNames = res.getStringArray(R.array.button_names);
            layoutInflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
    
        @Override
        public GridAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            return new GridAdapter.ViewHolder(layoutInflater.inflate(R.layout.item, null));
        }
    
        @Override
        public void onBindViewHolder(final GridAdapter.ViewHolder viewHolder, final int position) {
            viewHolder.button.setText(tempButtonNames[position]);
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public int getItemCount() {
            return tempButtonNames.length;
        }
    
        class ViewHolder extends RecyclerView.ViewHolder {
    
            Button button;
    
            ViewHolder(View itemView) {
                super(itemView);
                button = (Button) itemView.findViewById(R.id.button);
            }
        }
    }
    

    }

    在 build.gradle 中添加这个

    compile 'com.android.support:recyclerview-v7:25.3.0'
    

    希望您的问题得到解决。

    推荐使用 RecyclerView。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-31
      • 1970-01-01
      • 2013-10-28
      • 2020-05-25
      • 1970-01-01
      • 2016-10-21
      • 2020-09-28
      • 2013-04-15
      相关资源
      最近更新 更多