ViewPager

时间:2017-03-22 03:03:10

标签: java android android-asynctask android-pageradapter

首先,我是Android和java的新手,因为我来自网络开发者背景。

最近,我尝试开发和应用程序用于学习目的,但我在开发过程中遇到了一个令人头痛的问题。

我有一个主要活动触发Asynctask通过php文件从我的wamp数据库中获取id列表。

我的主要活动文件的一部分 - login_main.java

public class login_main extends AppCompatActivity implements OnDataSendToActivity{
    ViewPager viewPager;
    CustomAdapter adapter;

    ArrayList<String> images = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        //setSupportActionBar(toolbar);

        SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0); // 0 - for private mode
        SharedPreferences.Editor editor = pref.edit();
        String username = pref.getString("username", null);

        String type = "getProfileImages";

        RetrieveData retrieveData = new RetrieveData(this);

        retrieveData.execute(type,username);

        viewPager = (ViewPager) findViewById(R.id.view_pager);
    }


    public void sendData(String response) {
        try {
            JSONObject jsonObject = new JSONObject(response);
            JSONArray result = jsonObject.getJSONArray("result");
            for (int i = 0 ; i < result.length(); i++) {
                JSONObject obj = result.getJSONObject(i);
                String id = obj.getString("image"+i);
                String url = "http://192.168.12.252/"+id+"/profile.png";
                images.add(url);
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
        adapter = new CustomAdapter(login_main.this,images);//set ur image array here
        viewPager.setAdapter(adapter);
    }

AsyncTask文件

public class RetrieveData extends AsyncTask<String,Void,String>{
    Context context;
    RetrieveData(Context ctx) {
        context = ctx;
    }
    private OnDataSendToActivity dataSendToActivity;

    public RetrieveData(Activity activity){
        dataSendToActivity = (OnDataSendToActivity)activity;
    }

    @Override
    protected String doInBackground(String... params) {
        String profile_url = "http://192.168.12.252/getprofile.php";
        String image_url = "http://192.168.12.252/imagelist.php";
        String type = params[0];

        if(type.equals("getProfile")){
            try {
                String user_name = params[1];
                URL url = new URL(profile_url);
                HttpURLConnection httpURLConnection = null;
                httpURLConnection = (HttpURLConnection)url.openConnection();
                httpURLConnection.setRequestMethod("POST");
                httpURLConnection.setDoOutput(true);
                httpURLConnection.setDoInput(true);

                httpURLConnection.setDoOutput(true);
                httpURLConnection.setDoInput(true);
                OutputStream outputStream = httpURLConnection.getOutputStream();
                BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
                String post_data = URLEncoder.encode("user_name", "UTF-8")+"="+URLEncoder.encode(user_name, "UTF-8");
                bufferedWriter.write(post_data);
                bufferedWriter.flush();
                bufferedWriter.close();
                outputStream.close();

                InputStream inputStream = httpURLConnection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"iso-8859-1"));
                String result = null;
                result = bufferedReader.readLine();
                bufferedReader.close();
                inputStream.close();
                httpURLConnection.disconnect();
                return result;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else if(type.equals("getProfileImages")){
            try {
                String user_name = params[1];
                URL url = new URL(image_url);
                HttpURLConnection httpURLConnection = null;
                httpURLConnection = (HttpURLConnection)url.openConnection();
                httpURLConnection.setRequestMethod("POST");
                httpURLConnection.setDoOutput(true);
                httpURLConnection.setDoInput(true);

                httpURLConnection.setDoOutput(true);
                httpURLConnection.setDoInput(true);
                OutputStream outputStream = httpURLConnection.getOutputStream();
                BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
                String post_data = URLEncoder.encode("Image", "UTF-8")+"="+URLEncoder.encode("Image", "UTF-8")+"&"+URLEncoder.encode("user_name", "UTF-8")+"="+URLEncoder.encode(user_name, "UTF-8");
                bufferedWriter.write(post_data);
                bufferedWriter.flush();
                bufferedWriter.close();
                outputStream.close();

                InputStream inputStream = httpURLConnection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"iso-8859-1"));
                String result = null;
                result = bufferedReader.readLine();
                bufferedReader.close();
                inputStream.close();
                httpURLConnection.disconnect();
                return result;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        dataSendToActivity.sendData(result);
    }

页面适配器文件

public class CustomAdapter extends PagerAdapter{
    Activity activity;
    ArrayList<String> images = new ArrayList<>();
    LayoutInflater inflater;

    public CustomAdapter(Activity activity, ArrayList<String> images){
        this.activity = activity;
        this.images = images;
    }

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

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view==object;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        inflater = (LayoutInflater)activity.getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View itemView = inflater.inflate(R.layout.swipe,container,false);

        ImageView image;
        image = (ImageView)itemView.findViewById(R.id.imageView);


        DisplayMetrics dis = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(dis);
        int height = dis.heightPixels;
        int width = dis.widthPixels;
        image.setMinimumHeight(height);
        image.setMinimumWidth(width);
        try{
            Picasso.with(activity.getApplicationContext())
                    .load(images.get(position))
                    .placeholder(R.mipmap.ic_launcher)
                    .error(R.mipmap.ic_launcher)
                    .into(image);
        }catch (Exception ex){

        }

        container.addView(itemView);
        return itemView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        ((ViewPager) container).removeView((View)object);
    }
}

所以让我在这里解释一下,这里有什么。我的应用程序所做的是它将从我的phpmysql中获取一组id,从asynctask获取后,它使用Interface发送数据回主活动,这是sendData函数中的sendData函数你可以看到有一个循环到循环遍历每个id并生成url图像链接并将其存储到字符串数组中,变量名称是图像,页面适配器将使用Picasso插件将图像放入页面适配器中的imageView。

try {
            JSONObject jsonObject = new JSONObject(response);
            JSONArray result = jsonObject.getJSONArray("result");
            for (int i = 0 ; i < result.length(); i++) {
                JSONObject obj = result.getJSONObject(i);
                String id = obj.getString("image"+i);
                String url = "http://192.168.12.252/"+id+"/profile.png";
                images.add(url);
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
        adapter = new CustomAdapter(login_main.this,images);//set ur image array here
        viewPager.setAdapter(adapter);

问题是我想让这些图像可点击,当它点击时,它会显示该特定id的信息,如何将id与这些图像映射并使它们可点击,当它点击时,它会做另一个asynctask到检索该ID的更多详细信息

2 个答案:

答案 0 :(得分:0)

您可以更改Adapter类以获取ID的ArrayList:

public class CustomAdapter extends PagerAdapter{
    ArrayList<String> mIds = new ArrayList<>();

    public CustomAdapter(Activity activity, ArrayList<String> images, ArrayList<String> ids){
        mIds = ids;
    }

然后,在instantiateItem()

image.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View view){
        String clickedId = mIds.get(position);
        // Do something with the selected image Id
    }
});

不要忘记将您的通话更改为new CustomAdapter(activity, images, ids)

答案 1 :(得分:0)

我建议你创建自己的Object(Class),它有item(id,filename,...)。将ArrayList<YourObjectName>传递给CustomAdapter