java - 打开 Activity 并根据 ListView 选择进行填充

标签 java android listview

我正在尝试将数据从自定义 ListView 传递到新 Activity 并填充其 TextView。它确实有效,但它总是占据添加的第一个位置并将其传递。如何让它传递点击的数据?

主要 Activity

package uk.co.jaunt_app.jaunt;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;
import com.firebase.client.DataSnapshot;
import com.firebase.client.Firebase;
import com.firebase.client.FirebaseError;
import com.firebase.client.ValueEventListener;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;

import java.util.ArrayList;
import java.util.List;

import static uk.co.jaunt_app.jaunt.R.id.Posts;

public class MainActivity extends AppCompatActivity {

    private FloatingActionButton addmap;
    private Button settingbtn;
    private TextView mNameTextView;
    private TextView mEmailTextView;
    ListView mPosts;
    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggle mDrawerToggle;
    private CharSequence mDrawerTitle;
    private CharSequence mTitle;
    ArrayAdapter<String> adapter;
    private FirebaseAuth auth;
    private ArrayList<feed> feedPop = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setLogo(R.drawable.jauntlogodark);
        getSupportActionBar().setDisplayUseLogoEnabled(true);
        setContentView(R.layout.activity_main);

        Firebase.setAndroidContext(this);

        Firebase ref = new Firebase(Config.FIREBASE_URL);
        FirebaseUser currentFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();

        String uid = currentFirebaseUser.getUid();
        Firebase usersRef = ref.child("Users").child(uid).child("name");
        Firebase emailRef = ref.child("Users").child(uid).child("email");
        Firebase postRef = ref.child("Users").child(uid).child("Maps");

        postRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                for (final DataSnapshot postSnapshot : snapshot.getChildren()) {
                    //Getting the data from snapshot

                    Person person = postSnapshot.getValue(Person.class);
                    final String mapName = person.getMapName();
                    final String mapid = person.getMapID();
                    final String mapStartLat = person.getStartLat();
                    final String mapStartLong = person.getStartLong();
                    final String mapEndLat = person.getEndLat();
                    final String mapEndLong = person.getEndLong();

                    adapter.notifyDataSetChanged();

                    feedPop.add(
                            new feed(mapName, mapStartLat, mapStartLong, mapEndLat, mapEndLong));

                    final ArrayAdapter<feed> adapter = new feedArrayAdapter(MainActivity.this, 0, feedPop);

                    ListView listView = (ListView) findViewById(R.id.customListView);
                    listView.setAdapter(adapter);

                    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View view,
                                                int position, long id) {

                            Intent intent = new Intent(MainActivity.this, ViewUserMapActivity.class);
                            intent.putExtra("mapName", mapName.toString());
                            intent.putExtra("mapStartLat", mapStartLat.toString());
                            intent.putExtra("mapStartLong", mapStartLong.toString());
                            intent.putExtra("mapEndLat", mapEndLat.toString());
                            intent.putExtra("mapEndLong", mapEndLong.toString());
                            startActivity(intent);
                        }
                    });


                }
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {
                Toast.makeText(getApplicationContext(),
                        "Cancelled", Toast.LENGTH_LONG)
                        .show();
            }
        });

        //create property elements


        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);

        mPosts = (ListView) findViewById(Posts);
        mPosts.setAdapter(adapter);

        List<Nav> navList= new ArrayList<Nav>();
        navList.add(new Nav("Profile"));
        navList.add(new Nav("Feed"));
        navList.add(new Nav("Maps"));
        navList.add(new Nav("Most Popular"));
        navList.add(new Nav("Settings"));
        navList.add(new Nav("Report a Bug"));

        ArrayAdapter<Nav> navadapter = new ArrayAdapter<Nav>(this,android.R.layout.simple_list_item_1, navList);
        final ListView lv= (ListView) findViewById(R.id.left_drawer);
        lv.setAdapter(navadapter);

        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            int itemPosition = position;

                switch(itemPosition) {

                    case 0:
                        Intent menuItem = new Intent(MainActivity.this, UserMapActivity.class);
                        startActivity(menuItem);
                        break;
                    case 1:
                        menuItem = new Intent(MainActivity.this, UserMapActivity.class);
                        startActivity(menuItem);
                        break;
                    case 2:
                        menuItem = new Intent(MainActivity.this, UserMapActivity.class);
                        startActivity(menuItem);
                        break;

                    case 3:
                        menuItem = new Intent(MainActivity.this, UserMapActivity.class);
                        startActivity(menuItem);
                        break;

                    case 4:
                        menuItem = new Intent(MainActivity.this, SettingsActivity.class);
                        startActivity(menuItem);
                        break;

                    case 5:
                        menuItem = new Intent(MainActivity.this, UserMapActivity.class);
                        startActivity(menuItem);
                        break;
                }
            }
        });

        mNameTextView = (TextView) findViewById(R.id.NameTextView);

        usersRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                String name = dataSnapshot.getValue(String.class);
                mNameTextView.setText(name);

            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
        });

        mEmailTextView = (TextView) findViewById(R.id.EmailTextView);

        emailRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                String email = dataSnapshot.getValue(String.class);
                mEmailTextView.setText(email);

            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
        });



        addmap = (FloatingActionButton) findViewById(R.id.add_map);
        addmap.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                Answers.getInstance().logCustom(new CustomEvent("Added Map"));
                Intent intent = new Intent(MainActivity.this, MapStartActivity.class);
                startActivity(intent);
            }
        });

        settingbtn = (Button) findViewById(R.id.settingbtn);
        settingbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SettingsActivity.class);
                startActivity(intent);
            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.activity_menu_drawer, menu);
        return true;
    }

}

//custom ArrayAdapter
class feedArrayAdapter extends ArrayAdapter<feed>{

    private Context context;
    private List<feed> feedPop;

    //constructor, call on creation
    public feedArrayAdapter(Context context, int resource, ArrayList<feed> objects) {
        super(context, resource, objects);

        this.context = context;
        this.feedPop = objects;
    }

    //called when rendering the list
    public View getView(int position, View convertView, ViewGroup parent) {

        //get the property we are displaying
        feed feed = feedPop.get(position);

        //get the inflater and inflate the XML layout for each item
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.feed_listview, null);

        TextView others = (TextView) view.findViewById(R.id.others);
        TextView mapname = (TextView) view.findViewById(R.id.address);

        //set address and description
        String completeOthers = feed.getFeedStartLat() + ", " + feed.getFeedStartLong() + ", " + feed.getFeedEndLat() + ", " + feed.getFeedEndLong();
        others.setText(completeOthers);

        //set address and description
        String completeAddress = feed.getFeedName();
        mapname.setText(completeAddress);

        return view;
    }
}

最佳答案

根据位置从 ArrayList 获取值,然后传递给 Activity

intent.putExtra("mapName", feedPop.get(position).getmapName().toString());

关于java - 打开 Activity 并根据 ListView 选择进行填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44336081/

相关文章:

java - Android:创建一个覆盖一半屏幕并自行更新的 ListView

android - 加快数据库写入

android - ListView OnClickListener 在 Fragment 中不起作用

java - 将图像图标导出为缓冲图像

Java Jenkins.war 错误

java - 为什么 Pattern.quote 总是返回带引号的字符串?

java - jpa实体管理器回滚不起作用

android - 如何使用 RippleDrawable (API 21) 以编程方式设置按钮背景

Java servlet : only allow own client

android - 在崩溃报告中指定 logcatArguments 时,Acra 缺少 LOGCAT