0

im creating an app for a website, bayfiles.net I have a working listview which receive json data. This is working fine with filename and size, now i also have a ImageView. I want to determin which icon it should put in the icon holder. This is determined by the ending of the filename. e.g. filename ending with ".png" should show icon with "png" text in it. How is done ?

This is my working activity:

public class FilesActivity extends SherlockActivity {

    EditText editsearch;
    fileObjectAdapter adapter;
    String httpurl, sessionId, filetype;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dblist);

        ActionBar abs = getSupportActionBar();
        abs.setDisplayHomeAsUpEnabled(false);
        abs.setTitle("BAYFILES");
        //abs.setIcon(R.drawable.abs_logo);
        abs.setDisplayShowCustomEnabled(true);

        LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.RIGHT | Gravity.CENTER_VERTICAL);
        View customNav = LayoutInflater.from(this).inflate(R.layout.actionbar, null);
        abs.setCustomView(customNav, lp);
        abs.setDisplayShowCustomEnabled(true);

        abs.setDisplayOptions(abs.DISPLAY_SHOW_HOME|abs.DISPLAY_SHOW_CUSTOM);
        abs.setDisplayShowTitleEnabled(true);

        Crouton.makeText(this, "You have been signed in!", Style.CONFIRM).show();

        ImageButton btnSearch = (ImageButton) findViewById(R.id.action_search);
        btnSearch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d("Button Click","position");
            }
        });

        Context context = getApplicationContext();
        AppPrefs appPrefs = new AppPrefs(context);
        sessionId = appPrefs.getSessionId();
        newRequest("http://api.bayfiles.net/v1/account/files?session=" + sessionId);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
        inflater.inflate(R.menu.menu, (com.actionbarsherlock.view.Menu) menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch(item.getItemId())
        {
        case R.id.refresh:
            newRequest("http://api.bayfiles.net/v1/account/files?session=" + sessionId);
            return true;

        case R.id.settings:
            Intent startNewActivityOpen = new Intent(FilesActivity.this, AccountActivity.class);
             startActivityForResult(startNewActivityOpen, 0);
            return true;

        case R.id.upload:
            Crouton.makeText(this, "Coming soon!", Style.INFO).show();
            return true;

        case R.id.link:
            Crouton.makeText(this, "Add link from BayFiles", Style.INFO).show();
            return true;

        case R.id.folder:
            Crouton.makeText(this, "Not available yet!", Style.INFO).show();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onContextItemSelected(android.view.MenuItem item) {
        switch(item.getItemId()){
        case R.id.info:
            Crouton.makeText(this, "Coming soon!", Style.INFO).show();
            Log.d("log_tag", "Info");
            break;
        case R.id.delete:
            new RequestTask().execute(httpurl);
            newRequest("http://api.bayfiles.net/v1/account/files?session=" + sessionId);
            break;
        }
        return super.onContextItemSelected(item);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        MenuInflater inflate = getMenuInflater();
        inflate.inflate(R.menu.context_menu, menu);
    }

    public static String readableFileSize(long size) {
        if(size <= 0) return "0";
        final String[] units = new String[] { "B", "KB", "MB", "GB", "TB" };
        int digitGroups = (int) (Math.log10(size)/Math.log10(1024));
        return new DecimalFormat("#,##0.#").format(size/Math.pow(1024, digitGroups)) + " " + units[digitGroups];
    }

    public void newRequest(String url){
        String response = null;
        DefaultHttpClient httpClient = new DefaultHttpClient();
        ResponseHandler <String> resonseHandler = new BasicResponseHandler();
        HttpPost postMethod = new HttpPost(url);

        try {
            JSONObject json = new JSONObject();

               postMethod.setEntity(new ByteArrayEntity(json.toString().getBytes("UTF8")));
               postMethod.setHeader( "Content-Type", "application/json" );
               response = httpClient.execute(postMethod,resonseHandler);
               JSONObject request = new JSONObject(response);

               ArrayList<fileObject> objectList = new ArrayList<fileObject>();

               for (Iterator<?> keyIterator = request.keys(); keyIterator.hasNext(); ) {
                   String key = (String) keyIterator.next();
                   JSONObject object = request.optJSONObject(key);

                   if (object != null) {
                       long l = Long.parseLong(object.getString("size"));
                       String size = readableFileSize(l);
                       String[] filetype = object.getString("filename").split("\\.");
                       Log.d("log_tag", filetype[1]);

                       fileObject obj = new fileObject();

                       obj.setFileId(key);
                       obj.setFileName(object.getString("filename"));
                       obj.setSize(size);
                       obj.setInfoToken(object.getString("infoToken"));
                       obj.setDeleteToken(object.getString("deleteToken"));
                       obj.setSha1(object.getString("sha1"));
                       obj.setFileType(filetype[1]);
                       objectList.add(obj);

                   }
               }        
               final ListView lv1 = (ListView) findViewById(R.id.listobjects);
               lv1.setAdapter(new fileObjectAdapter(this, objectList));
               lv1.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> a, View v, int position, long id) {
                    Object o = lv1.getItemAtPosition(position);
                    fileObject fullObject = (fileObject) o;
                    Log.d("log_tag", "Filename: " + fullObject.getFileName());
                    httpurl = "http://bayfiles.net/file/" + fullObject.getFileId() + "/" + fullObject.getInfoToken() + "/" + fullObject.getFileName();
                }  
               });

               lv1.setOnItemLongClickListener(new OnItemLongClickListener() {

                   public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int position, long id) {
                       registerForContextMenu(lv1); 
                       openContextMenu(lv1);

                       Object o = lv1.getItemAtPosition(position);
                       fileObject fullObject = (fileObject) o;
                       httpurl = "http://api.bayfiles.net/v1/file/delete/" + fullObject.getFileId() + "/" + fullObject.getDeleteToken();
                       return true;
                   }
               }); 
        }
        catch(Exception e)
        {      
            e.printStackTrace();
            Log.d("log_tag", "Error: " + e.toString());

        }
    }
}

My fileObject:

package com.spxc.bayfiles.adapter;

    public class fileObject {

        private String fileName;
        private String size;
        private String infoToken;
        private String deleteToken;
        private String sha1;
        private String fileId;
        private String fileType;

        public String getFileName() {
            return fileName;
        }

        public void setFileName(String fileName) {
            this.fileName = fileName;
        }

        public String getSize() {
            return size;
        }

        public void setSize(String size) {
            this.size = size;
        }

        public String getInfoToken() {
            return infoToken;
        }

        public void setInfoToken(String infoToken) {
            this.infoToken = infoToken;
        }

        public String getDeleteToken() {
            return deleteToken;
        }

        public void setDeleteToken(String deleteToken) {
            this.deleteToken = deleteToken;
        }

        public String getSha1() {
            return sha1;
        }

        public void setSha1(String sha1) {
            this.sha1 = sha1;
        }

        public String getFileId() {
            return fileId;
        }

        public void setFileId(String fileId) {
            this.fileId = fileId;
        }
        public String getFileType(){
            return fileType;
        }
        public void setFileType(String fileType){
            this.fileType = fileType;
        }
    }

And my adaper:

public class fileObjectAdapter extends BaseAdapter {
     private static ArrayList<fileObject> searchArrayList;

     private LayoutInflater mInflater;

     public fileObjectAdapter(Context context, ArrayList<fileObject> results) {
      searchArrayList = results;
      mInflater = LayoutInflater.from(context);
     }

     public int getCount() {
      return searchArrayList.size();
     }

     public Object getItem(int position) {
      return searchArrayList.get(position);
     }

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

     public View getView(int position, View convertView, ViewGroup parent) {
      ViewHolder holder;
      if (convertView == null) {
       convertView = mInflater.inflate(R.layout.dbitems, null);
       holder = new ViewHolder();
       holder.txtFileName = (TextView) convertView.findViewById(R.id.size);
       holder.txtSize = (TextView) convertView.findViewById(R.id.filename);
       holder.imgIcon = (ImageView) convertView.findViewById(R.id.typeimg);

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

      holder.txtFileName.setText(searchArrayList.get(position).getFileName());
      holder.txtSize.setText(searchArrayList.get(position).getSize());
      //holder.imgIcon.setImageResource(SET DRAWABLE ACCORDING TO ENDING);

      return convertView;
     }

     static class ViewHolder {
      TextView txtFileName;
      TextView txtSize;
      ImageView imgIcon;
     }
     public void filter(String charText) {
            charText = charText.toLowerCase(Locale.getDefault());
            searchArrayList.clear();
            if (charText.length() == 0) {
                searchArrayList.addAll(searchArrayList);
            } 
            else
            {
                for (fileObject wp : searchArrayList) 
                {
                    if (wp.getFileName().toLowerCase(Locale.getDefault()).contains(charText)) 
                    {
                        searchArrayList.add(wp);
                    }
                }
            }
            notifyDataSetChanged();
        }
    }

As you can see, i get the full filename and split it into two pieces. Filename and extension. Then i'll make an if statement to to check which file extension it is. Then i want it to change the icon in the list item according to the file extension. How can this be done?

Any help is much appreciated!

Stian Instebo
  • 653
  • 1
  • 12
  • 31
  • Is `switch(fileType)` too simple here? – Geobits Jul 22 '13 at 19:24
  • I think so because, i have to determin the image in the adapter – Stian Instebo Jul 22 '13 at 19:31
  • 1
    you can have pre-made icons in your resource folder, e.g., jpg_icon, png_icon, etc. (then you would set the image drawable resource - http://stackoverflow.com/questions/7799752/android-java-set-image-resource ) or you can use a TextView and set the text dynamically based on the image type. – droideckar Jul 22 '13 at 20:20

1 Answers1

0

I apologize if I'm misunderstanding your question. I've gone through it a few times to be sure, but my solution is relatively simple, and due to how you seem to know what your doing in the code, I'm surprised you wouldn't have gotten this yet. So again, I apologize if I've misunderstood.

You need to set a drawable resource on the ImageView. This very simple, but the first part is you need to have several different versions in side your /res folder if you want things to look good on various screen resolutions. You basically need images scaled to different resolutions placed in the corresponding folder. MDPI = 1.0X, HDPI = 1.5X, XHDPI = 2.0X.

So lets say you have a picture you want to display for the .exe file extension. You would make the file at the base 72 resolution for MDPI, and then create scaled versions for HDPI, and XHDPI. Let's say you name the picture file exe_picture.png. You would place the corresponding file called exe_picture in each of the folders. Then you could reference and place the image in the ImageView programatically in your adapters getView function as such (please note the following code is untested):

holder.txtFileName.setText(searchArrayList.get(position).getFileName());
holder.txtSize.setText(searchArrayList.get(position).getSize());

String fileType = searchArrayList.get(position).getFileType();
int imageResID = 0;
if (fileType.equals("exe")) {
    imageResID = R.drawable.exe_picture;
}

holder.imgIcon.setImageResource(imageResID);

From there of course you could simply chain else if statement for all the file types you wanted to support.

Hope this helps! Best of luck.

spierce7
  • 14,797
  • 13
  • 65
  • 106