如何在AppCompatActivity中实现ListView?

4
public class MainActivity extends AppCompatActivity {

   protected List<ParseObject> mStatus;

   @Override
   protected void onCreate(Bundle savedInstanceState) {

   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);
   Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
   setSupportActionBar(toolbar);

   ParseUser currentUser = ParseUser.getCurrentUser();

   if (currentUser != null){
       //show user the homepage
       ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("Status");
       query.findInBackground(new FindCallback<ParseObject>() {
       @Override
       public void done(List<ParseObject> status, ParseException e) {
       if (e==null){
           //success
           mStatus = status;

            StatusAdapter adapter = new StatusAdapter(getListView().getContext(), mStatus);
            setListAdapter(adapter);
        } else {
        //ther was a problem.
        }
      }
    });

    } else {
        //show login screen
        Intent takeUserToLogin = new Intent(this, LoginActivity.class);
        startActivity(takeUserToLogin);
    }
}

在以上代码中,我在getListView()setListAdapter处遇到了错误。

我在StatusAdapter类中有以下代码:

public class StatusAdapter extends ArrayAdapter<ParseObject> {

    protected Context mContext;
    protected List<ParseObject> mStatus;

    public StatusAdapter(Context context, List<ParseObject> status){
        super(context, R.layout.homepagecustomlayout, status);
        mContext = context;
        mStatus = status;
    }

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

        if(convertView == null){
            convertView = LayoutInflater.from(mContext).inflate(
                    R.layout.homepagecustomlayout,null);
            holder = new ViewHolder();
            holder.usernameHomepage = (TextView)convertView.findViewById(R.id.usernameHP);
            holder.statusHomepage = (TextView)convertView.findViewById(R.id.statusHP);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        ParseObject statusObject = mStatus.get(position);

        //user
        String username = statusObject.getString("user");
        holder.usernameHomepage.setText(username);

        //status
        String status = statusObject.getString("newStatus");
        holder.statusHomepage.setText(status);

        return convertView;
    }

    public static class ViewHolder{
        TextView usernameHomepage;
        TextView statusHomepage;
    }
}

我正在按照这个教程学习。

2个回答

3

getListView()setListAdapter()ListActivity/ListFragment的方法。

但是,你似乎正在扩展AppCompatActivity。因此,你可以在activity_main中添加一个listView; 然后:

ListView listview = findViewById(R.id.yourlistID); 

通过这种方式设置适配器 - listView.setAdapter();

希望这可以帮助你!


0

需要进行的几个关键更改

当从 ListView 切换到 AppCompatActivity 时,我遇到了相同的问题。你需要进行少量更改来替换 ListView 内置的功能。我在这里列出了它们以方便你的迁移。

你不能再调用`this`来获取`ListView`。你需要从视图中获取它。我建议创建一个像这样的方法:
``` protected ListView getListView() { return findViewById( android.R.id.list ); } ```
*注意:如果你的列表没有一个id为`list`,那么你需要更新它,但是我建议尽可能使用id `list`,因为它可以保持一致并且意味着你可以在多个Activity上使用此方法。*
你不能只是覆盖`onListItemClick`方法,因为它在`AppCompatActivity`上不存在,所以你需要创建自己的监听器并将其设置到列表中,并在`onCreate`中添加它。这里有一个例子:
``` getListView().setOnItemClickListener( new AdapterView.OnItemClickListener() { @Override public void onItemClick( AdapterView parent, View view, int position, long id ) { Cursor cursor = (Cursor) getListView().getItemAtPosition( position );
String itemId = cursor.getString( cursor.getColumnIndex( "id" ) );
Intent itemActivityIntent = new Intent( view.getContext(), Item.class );
itemActivityIntent.putExtra( view.getContext().getPackageName() + ".itemId", itemId );
startActivity( itemActivityIntent); } ) } ); ```
你不能再在`populateListView`中调用`this.setListAdapter`。相反,你需要获取ListView并调用`setAdapter`,像这样:
``` getListView().setAdapter(adapter); ```

应该就可以了。可能还有一些其他的调整需要根据你的设置进行,但这些是最重要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接